.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  ?

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

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

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

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

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

保麗龍在日光下分解較快…幾十年到幾世紀就夠了

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

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

【其他文章推薦】

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

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

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

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

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

※超省錢租車方案

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

摘錄自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/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

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

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

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

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

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

對抗乾旱 澳洲砸208億改善新南威爾斯省水利設施

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

新南威爾斯省近年飽受乾旱之苦。路透社報導,澳洲政13日表示,聯邦當局和新南威爾斯省政府將花費6億5000萬澳幣,升級新南威爾斯省中西部的懷安加拉大壩(Wyangala Dam),並投資4億8000萬澳幣,在坦幄斯(Tamworth)附近興建新的頓格萬大壩(Dungowan Dam)。

澳洲總理莫里森(Scott Morrison)在聲明中說:「鄉村和區域社區持續受到乾旱影響,對此,我們的應對方式既全面又堅定。」「這滿足了對財政援助和長期投資的迫切需求,以發展未來的抗旱能力。」

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

【其他文章推薦】

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

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

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

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

※超省錢租車方案

市區驚見超巨大蟒蛇蛻皮 澳洲雪梨發布警令

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

雪梨西部小鎮錫佛戴爾(Silverdale)居民10日發現一條大蟒蛇的蛻皮出現在鎮上,目擊的民眾立即通報當局,經研判後確認是一條成年巨蟒近期遺留下來的新皮,代表巨蛇有很大機率還藏身於鎮上。

新南威爾士州(NSW)政府隨後發布聲明,向居民描述他們當前面臨的潛在危機,當局除要求民眾一旦目擊應立即通報有關部門外,更警告切勿與蟒蛇有所接觸,以免發生危險。

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

【其他文章推薦】

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

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

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

※超省錢租車方案

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

蘇格蘭「全面禁止塑膠棉花棒」 環保人士:前所未有的勝利

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

綜合外媒報導,英國民眾每年估計使用50億支塑膠吸管、3億支塑膠攪拌棒及20億枝塑膠棉花棒,其中,塑膠棉花棒多數被沖進馬桶,藉下水道流入海洋,對海洋生態及野生動物造成難以估計的危害;英國原訂從2020年4月起全面禁止販售塑膠吸管、塑膠攪拌棒及塑膠棉花棒,而蘇格蘭議會率先在9月通過2018年提案的「全面禁止塑膠棉花棒生產與銷售」法案,目前此禁令已正式生效,成為英國宣布2020年4月起全面「禁塑」後,率先「全面禁止塑膠棉花棒」生產與銷售的區域。

過去25年間,蘇格蘭環保人士總共在當地海灘上「撿起」超過15萬根塑膠棉花棒,他們稱這是「海洋與野生動植物的勝利」,也期待蘇格蘭政府能採取更多措施,制止這場「塑膠潮」,也希望其他國家能跟進。

當地海洋保護協會的蓋梅爾(Catherine Gemmel)表示,這項禁令生效對「海洋和野生動植物」而言,是「前所未有」的勝利,期待蘇格蘭政府能繼續採取其他行動。

 

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

【其他文章推薦】

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

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

※回頭車貨運收費標準

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

※超省錢租車方案

環團包圍《BBC》總部 要求以「二戰狀態」報導氣候變遷

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

關注氣候變遷議題的環保團體「反抗滅絕」(Extinction Rebellion)11包圍英國《BBC》倫敦總部的消息,呼籲該公共媒體將氣候變遷視為如「二戰」般的緊急狀態報導,並向社會大眾說實話。

環團發言人麥卡錫(Donnachadh McCarthy)表示:「我們聚集於此是因為《BBC》拒絕宣布『氣候緊急狀態』,且他們不斷將『高碳排放』的生活正常化、合理化,像他們的節目《頂級跑車秀》(Top Gear)就是一例。」

《BBC》發言人則表示她目前無法評論總部的安全問題,她拒絕為《BBC》的報導力度進行回覆。

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

【其他文章推薦】

※超省錢租車方案

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

※回頭車貨運收費標準

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

中央地方攜手合作,全面啟動臺灣智慧水聯網

環保署8月17日在新竹市舉辦「2020臺灣智慧水聯網」啟動發表會,正式發表5種水質感測元件及固定式、移動式、手持式等3款水質感測器,同時發給13個縣市政府400臺感測器,合辦建構我國智慧水聯網。智慧水聯網為打破傳統人工採樣限制,利用水質感測器每分鐘感測河川水體的酸鹼度、電導度、溫度及溶氧,結合地理資訊系統定位,以AI人工智慧即時監控水質在時間及空間上的變化,達到環境智慧執法、推動公民環境教育以及拓展相關產業跨域應用等目標。

智慧水聯網過去4個月試驗應用期間,於3縣市共查獲17件異常案例,有2件地檢署偵辦中,持續追繳罰鍰,在水質感測器輔助下,打擊不肖廠商效果顯著,讓污染無所遁形。環保署為擴大科技執法應用層面,已與全臺13個縣市合作,將布設在陳情或列管工廠集中地區,24小時水質監控不間斷,並將針對偵測的污染,即時智慧派遣查處污染。

環保署表示,除了智慧稽查外,5G時代來臨,環保署所研發之手持式水質感測器具備成本低、使用簡單、結合個人行動裝置等優點,學術單位可利用感測器推動環境教育、探索水體生態等課程,也成為河川巡守隊巡查新利器,鼓勵隊員巡檢並參與污染通報、髒亂清理等工作,讓政府民眾齊心共創護水新生活。

環保署也持續活化產業跨域應用,利用新型感測技術推動各類用水水質管理,促進產業交流與技術媒合,提升產業數位轉型量能。未來環保署將以「優化環境治理、驅動民間感測、開展產業應用」為目標,達到「感測,無水不在;應用,無限可能」數位時代願景!

新聞來源:https://enews.epa.gov.tw/Page/3B3C62C78849F32F/2042f3c7-e254-47af-aeca-3a6999f0178c

【其他文章推薦】

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

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

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

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

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