.NET Core請求控制器Action方法正確匹配,但為何404?

前言

有些時候我們會發現方法名稱都正確匹配,但就是找不到對應請求接口,所以本文我們來深入了解下何時會出現接口請求404的情況。

匹配控制器Action方法(404)

首先我們創建一個web api應用程序,我們給出如下示例控制器代碼

[ApiController]
[Route("[controller]/[action]")]
public class WeatherController : ControllerBase
{
    [HttpGet]
    string Get()
    {
        return "Hello World";
    }
}

 

當我們進行如上請求時會發現接口請求不到,這是為何呢?細心的你應該可能發現了,對於請求方法是私有,而不是公共的,當我們加上public就可以請求到了接口

[HttpGet("get")]
public string Get()
{
    return "Hello World";
}

匹配控制器Action方法本質

經過如上示例,那麼對於Action方法的到底要滿足怎樣的定義才能夠不至於請求不到呢?接下來我們看看源碼怎麼講。我們找到DefaultApplicationModelProvider類,在此類中有一個OnProvidersExecuting方法用來構建控制器和Action方法模型,當我們構建完畢所有滿足條件的控制器模型后,緊接着勢必會遍歷控制器模型去獲取對應控制器模型下的Action方法,這裏只截取獲取Action方法片段,源碼如下:

foreach (var controllerType in context.ControllerTypes)
{    
    //獲取控制器模型下的Action方法
    foreach (var methodInfo in controllerType.AsType().GetMethods())
    {
        var actionModel = CreateActionModel(controllerType, methodInfo);
        if (actionModel == null)
        {
            continue;
        }

        actionModel.Controller = controllerModel;
        controllerModel.Actions.Add(actionModel);    
    }
}

上述紅色標記則是創建Action模型的重點,我們繼續往下看到底滿足哪些條件才創建Action模型呢?

protected virtual ActionModel CreateActionModel(TypeInfo typeInfo, MethodInfo methodInfo)
{
    if (typeInfo == null)
    {
        throw new ArgumentNullException(nameof(typeInfo));
    }

    if (methodInfo == null)
    {
        throw new ArgumentNullException(nameof(methodInfo));
    }

    if (!IsAction(typeInfo, methodInfo))
    {
        return null;
    }    
    ......    
}

到了這個方法裏面,我們找到了如何確定一個方法為Action方法的源頭,由於該方法有點長,這裏我採用文字敘述來作為判斷邏輯,如下:

protected virtual bool IsAction(TypeInfo typeInfo, MethodInfo methodInfo)
{
    //如果有屬性訪問器(無效)

    //如果有NonAction特性標識無效)

    //如果重寫Equals(Object), GetHashCode()方法(無效)

    //如果實現Dispose方法(無效)

    //如果是靜態方法(無效)

    //如果是抽象方法(無效)

    //如果是構造函數(無效)

    //如果是泛型方法(無效)

    //必須為公共方法
    return methodInfo.IsPublic;
}

如上是從方法定義的角度來過濾而獲取Action方法,除此之外,我們請求方法的名稱還可以自定義,比如通過路由、ActionName特性指定,那麼這二者是否存在優先級呢?比如如下示例:

[ApiController]
[Route("[controller]/[action]")]
public class WeatherController : ControllerBase
{
    [HttpGet]
    [ActionName("get1")]
    public string get()
    {
        var routeValue = HttpContext.Request.RouteValues.FirstOrDefault();

        return routeValue.Value.ToString();
    }
}

我們可以看到此時將以ActionName特性作為方法名稱。所以在上述過濾方法定義后開始構建方法模型,在此之後還會再做一步操作,那就是查找該方法是否通過ActionName特性標識,若存在則以ActionName特性標識給定的名稱作為請求方法名稱,否則以方法定義名稱為準,源碼如下:

var actionModel = new ActionModel(methodInfo, attributes);

AddRange(actionModel.Filters, attributes.OfType<IFilterMetadata>());

var actionName = attributes.OfType<ActionNameAttribute>().FirstOrDefault();
if (actionName?.Name != null)
{
    actionModel.ActionName = actionName.Name;
}
else
{
    actionModel.ActionName = methodInfo.Name;
}

還沒完,若是將路由特性放到Action方法上,如下,此時請求接口應該是weather/get還是weather/get1呢?

[ApiController]
public class WeatherController : ControllerBase
{
    [HttpGet]
    [Route("weather/get")]
    [ActionName("get1")]
    public string get()
    {
        var routeValue = HttpContext.Request.RouteValues.FirstOrDefault();

        return routeValue.Value.ToString();
    }
}

此時若我們以weather/get1請求將出現404,還是以路由特性模板給定為準進行請求,但最終會將路由上Action方法名稱通過ActionName特性上的名稱賦值給Action模型中的ActionName進行覆蓋,源碼如下,所以上述我們得到的action名稱為get1,,當然這麼做沒有任何實際意義。

public static void AddRouteValues(ControllerActionDescriptor actionDescriptor,ControllerModel controller,ActionModel action)
{
    foreach (var kvp in action.RouteValues)
    {
        if (!actionDescriptor.RouteValues.ContainsKey(kvp.Key))
        {
            actionDescriptor.RouteValues.Add(kvp.Key, kvp.Value);
        }
    }

    if (!actionDescriptor.RouteValues.ContainsKey("action"))
    {
        actionDescriptor.RouteValues.Add("action", action.ActionName ?? string.Empty);
    }

    if (!actionDescriptor.RouteValues.ContainsKey("controller"))
    {
        actionDescriptor.RouteValues.Add("controller", controller.ControllerName);
    }
}

總結

本文我們只是單獨針對查找Action方法名稱匹配問題做了進一步的探討,根據源碼分析,對Action方法名稱指定會做3步操作:第一,根據方法定義進行過濾篩選,第二,若方法通過AcionName特性標識則以其所給名稱為準,否則以方法名稱為準,最終賦值給ActionModel上的ActionName屬性,第三,將ActionModel上的ActionName值賦值給路由集合中的鍵Action。

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

越南將管制機車排氣 盼改善空氣污染

摘錄自2019年10月14日中央社報導

統計顯示,越南年均機車購買量達逾300萬輛,世界上僅次於印度、中國和印尼,目前河內市共有近74萬輛汽車和570萬輛機車,胡志明市共有逾73萬輛汽車和715萬輛機車。越南目前沒有機車排氣等定期檢驗制度。機車排氣被視為越南各城市最大空氣污染來源之一。

越南「民智報」新聞網站10日報導,南部胡志明市交通廳以機車排氣污染可能嚴重影響到民眾身體健康為由表示,將與資源與環境廳和越南機車製造商協會等單位討論制定機車排氣管制方案,再向中央政府提交審核。

此外,越南首都河內市資源與環境廳日前舉行一項有關空氣污染的會議,越南環境總局前副總局長黃楊松(Hoang Duong Tung)建議,政府應實施機車排氣定期檢驗。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

打擊非法捕撈 韓中漁政船聯合巡邏海域

摘錄自2019年10月14日中央社報導

南韓聯合新聞通訊社報導,南韓海洋水產部14日表示,中國漁船的非法捕撈行為導致海洋資源逐漸減少,亟需採取資源管理措施。韓國與中國漁政船即起啟動相關海域聯合巡邏,展開為期7天的打擊非法捕撈行動。執行任務的漁政船為南韓西海漁業管理團所屬「無窮花35號」,中國部分則為海警局北海分局「6306」船艇。

南韓海洋水產部表示,韓中兩國2014年首次執行聯合巡邏,至今共進行8次,總共攔截31艘中國非法捕撈漁船。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

新北清潔公司,居家、辦公、裝潢細清專業服務

※教你寫出一流的銷售文案?

印尼蘇門答臘近海5.9強震 震源深度僅10公里

摘錄自2019年10月13日自由時報報導

,台灣時間15日上午6時23分許,印尼蘇門答臘島西南方近海今天上午發生芮氏規模5.9強震,震源深度僅10公里,為極淺層強震,所幸至今尚無重大災情回傳。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※幫你省時又省力,新北清潔一流服務好口碑

※別再煩惱如何寫文案,掌握八大原則!

衣索比亞總理阿邁德推動環保、性平獲2019年諾貝爾和平獎

貝爾和平獎11日出爐,得獎者是衣索比亞總理阿邁德(Abiy Ahmed),原因是他結束該國與鄰國厄利垂亞之間長達20年的戰火,這項創舉又激發了非洲地區一系列的外交突破,阿邁德也提倡性別平等、環境保護。

阿邁德2018年4月上任,是該國第1位奧羅莫元首,在最初幾個月,他果斷、大膽地釋放政治犯,並對他們受到的酷刑予以譴責,也釋放被監禁的記者,甚至與政治反對派、民間社會對談,討論改革問題,並邀請先前流亡的政黨人士返國,還針對安全、司法部門進行重大改革。

阿邁德也致力於性別、環保問題,例如在國境內植樹造林以遏制氣候變化的負面影響。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是  USB CONNECTOR   ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案 ?

為吸引蘋果投資電池廠 特斯拉擬秀大眾車款 Model 3

美國豪華電動車製造商特斯拉(Tesla)執行長 Elon Musk 透過 Twitter 暗示要在 10 月 9 日發表與字母「D」有關的神秘商品,究竟會有什麼樣的新品出爐,網路謠言為之沸騰。   Global Equities Research 分析師 Trip Chowdhry 發表研究報告指出,特斯拉可能會在 10 月 9 日發表三件大事,分別是「Model S」電動轎車將增添四輪驅動的新車款、新增半自動自動駕駛甫助系統(semi-autonomous driver-assistance system,簡稱 SADAS),還可能推出大眾車款「Model 3」。   barron`s.com、MarketWatch 3 日報導,Chowdhry 指出,特斯拉超大電池廠「GigaFactory」目前仍有三大潛在投資人──LG Chem、三洋電機(Sanyo)以及蘋果(Apple Inc.),倘若特斯拉能夠秀出需要 GigaFactory 供應電池的 Model 3,那麼這 3 家潛在投資者決定投入的機率也會大為上升。從以上跡象來看,特斯拉很可能會發表 Model 3。   另外,Chowdhry 也預期特斯拉到時候會推出具有四輪驅動系統的新版 Model S,而新增添的半自動自動駕駛甫助系統還將使用以色列自駕車相機防撞感測器開發商 Mobileye N.V. 製作的相機鏡頭。     相關閱讀:

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

中德合作綱要簽署 電動車受惠

10月10日,中國國務院總理李克強在柏林同德國總理安格拉•默克爾共同主持第三輪中德政府磋商。雙方決定發表《中德合作行動綱要:共塑創新》(下文簡稱《綱要》)。《綱要》共包含86項條文,其中8項提及汽車工業,新能源汽車標準制定與應用推廣成為重中之重。   雙方同意,要繼續加大政府對電動汽車研發、市場開發、基礎設施建設等領域的扶持。雙方商定,給予企業平等享受電動汽車國家扶持和優惠的待遇,並在國家規章、標準制訂中加強協調。雙方將繼續深化中德在電動汽車領域的標準合作。雙方應在充電基建領域就擴建策略和經營模式等議題加強對話。   《綱要》提及,中德兩國應深化電動汽車示範專案和試點城市的交流與合作。在已建立的城市合作框架下,鼓勵中德其他具備條件的城市積極參與。雙方將在電動汽車戰略平臺框架下,探討共建充電基礎設施和電動汽車與智慧電網互通示範項目。它還提出由中國國家發展改革委和德國聯邦環境、自然保護、建築和核安全部牽頭,雙方將繼續深化在電動汽車電池回收利用領域的合作。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

特斯拉代號 D 新車出爐 搭半自動駕駛系統

  美國電動車厰特斯拉(Tesla)執行長馬斯克(Elon Musk)發表代號「D」的新一代豪華電動車 Model S,搭載雙電動馬達,由前一代的後輪驅動,升級為全時四輪傳動(AWD),起步加速到 100 公里只需 4 秒,充飽電可行駛 442.57 公里,採用鋰電池提供馬力,讓充電更快速方便,預計 12 月開始出貨。   馬斯克在美國時間 10 月 9 日發表先前他在推特預告的代號 D 車款,其實就是現有車款 Model S 車款的升級版,D 指的就是雙馬達(Dual Motors)。馬斯克表示,雙馬達 AWD 的設計,可提升行路能力,應付歐美惡劣天候,並提升效率、增強動力及加速性。   此外,新車款同時搭載全新自動駕駛(autopilot)軟體,配備包括長距離雷達、影像辨識鏡頭及 360 度的超音波聲納,雖無法完全自動駕駛,但可以判讀交通號誌與辨別行人,具備路邊停車輔助功能。且若停在自宅門口,車主可以召喚愛車,車內的車用電腦還能連結至車主行事曆,需要出門時汽車就能準備就緒。   (Source:)

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

F-英瑞搭電動車商機 下一步瞄準特斯拉

北美汽車水箱龍頭大廠英瑞國際 F-英瑞 9月受惠出貨成長,單月營收為 3.3 億元,累計前 9 月營收為 36.85 億元,年增 14.65%,英瑞看好電動車市場,攜手美國大廠合作開發新世代電動貨卡 (pick up),首年訂單銷售將達數萬台,下一步將接觸 TESLA,全面衝刺電動車市場。   F-英瑞第三季單季營收達到 11.13 億元,年增 1.64%,公司表示,北美車市持續改善,帶動 AM 市場成長,公司目前供應多家美國大型連鎖通路訂單,帶動今年成長,目前中國市場已經開始進入暖身階段,預計 2015 年中國市場也將成為另一成長引擎,公司看好明年在北美、中國兩大成長帶動下,營運將會水漲船高。   且為進軍電動車市場,F-英瑞將與美國大廠合作開發新世代電動貨卡,由於新款設計採用汽油發電來帶動運轉,整體續航力可以超過 600 公里,客戶對銷售相當樂觀,預計第 1 年銷售量就可以達到數萬台,由於電動車需要 4 套的冷卻系統,是一般車輛的 4 倍,因此業績將會倍數成長,下一階段將會將會接觸 Tesla,全面衝刺電動車市場。   除了中國、北美市場成長之外,F-英瑞也積極布局現在市佔率偏低的歐洲市場,由於全球汽車市場的成長,公司將積極規畫新產能,預計 2015 年將於東協設廠規劃 200 萬年產能的新廠。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

新北清潔公司,居家、辦公、裝潢細清專業服務

※教你寫出一流的銷售文案?

約定民生銀行 特斯拉將在中國20城市建400個充電樁

特斯拉與民生銀行達成合作,雙方約定將共同在中國20個城市的民生銀行自有營業廳及社區金融門店建至少400個充電樁。截至8月,特斯拉在中國建成的目的地充電裝置已超過370個。在此之前,特斯拉用了一年時間才在中國建了16個超級充電站。   此前,特斯拉已經與銀泰、SOHO和中國聯通簽署過類似的合作協定。其中,特斯拉與地產商銀泰集團宣佈合作啟動“目的地充電”項目,充電1個小時可行駛40公里;還計畫年內依託聯通營業廳在全國120個城市共同建設400個目的地充電站和20個城市超級充電站。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※幫你省時又省力,新北清潔一流服務好口碑

※別再煩惱如何寫文案,掌握八大原則!