天天看點

Dotnet站點多個路由對應同一個Action的總結

需求:有些浏覽器會屏蔽帶有Ad字樣的路徑,此時需要建立多個路由指向同一個Action。

例如:原來 : http://lalalalalala.org:1506/api/advert/common  現在需要 增加另一個請求路徑 http://lalalalalala.org:1506/api/guanggao/common 

1.   .Net Core 中追加這樣的路徑比較簡單,如下

Dotnet站點多個路由對應同一個Action的總結

隻需要增加在Controller和Action增加Route特性标簽,便能得到下面四個路徑,然後他們指向的都是Get方法. 可以在swagger中檢視:

Dotnet站點多個路由對應同一個Action的總結

2.   在DotNet Freamwork項目下:

某個系統是webapi 1,不具有特性路由功能,是以不能像.net core 一樣通過加标簽的方式進行重命名。

方法可以參考下面的解決方式,我在注冊路由的地方,将需要進行增加路由的方法,都增加了一個配置。

Dotnet站點多個路由對應同一個Action的總結

 在swagger中檢視的效果如下:

Dotnet站點多個路由對應同一個Action的總結

方法二,更新成webapi2,然後使用特性路由方式。

 1.更新【webapi 1】到【WebApi 2】,如下更新到最新

Dotnet站點多個路由對應同一個Action的總結

其中 不更新 WebHost 會出現下面的異常

Dotnet站點多個路由對應同一個Action的總結

2.手動添加特性路由的配置代碼,如下圖,添加如下代碼到預設的路由上面: config.MapHttpAttributeRoutes();

Dotnet站點多個路由對應同一個Action的總結

* 這裡注意下,特性路由要在普通路由規則上面。

如果把特性路由放在預設路由的下面,編譯不會出錯,但是在運作時候就會出現找不到Action 的問題,如下圖:

{

  "Message": "找不到與請求 URI“http://localhost:21094/api/Default2/Get?id=2”比對的 HTTP 資源。",

  "MessageDetail": "未找到與名為“Default2”的控制器比對的類型。"

 }

3.開始修改controller

Dotnet站點多個路由對應同一個Action的總結

通過 ~/api/xxx/yyy  可以重寫路由字首

Dotnet站點多個路由對應同一個Action的總結

 補充   Webapi2 裡面跨域問題

在第二步更新了webapi之後,在前端請求的時候,會出現跨域問題。解決可以參考我下面的做法:

1.更新或者安裝nuget 

Dotnet站點多個路由對應同一個Action的總結

然後在配置的地方添加如下代碼:   config.EnableCors();

Dotnet站點多個路由對應同一個Action的總結

  config.EnableCors() 裡面可以指定 跨域的Domain、Header以及Methond ,但是廣告系統原來在web.config進行了設定,是以這裡啟用一下就可以了。

Dotnet站點多個路由對應同一個Action的總結

啟動程式此時還是會出現一個問題:

目前端使用Ajax進行跨域請求的時候,會先試探性的發一個Option請求,然後得到對應的跨域資訊,如上面紅框中的配置。 當發現允許請求的時候,此時就進行下一步真實的請求。

問題在于這個Option請求傳回Code要是200,前端才認為是正常的。但是直接更新webapi之後,Option請求傳回是404 not found。 即使帶着這些配置的跨域資訊也不能被前端所處理。

是以在 每個請求的開始,增加一個判斷,将這個方法綁定到BeginRequest事件上。

Dotnet站點多個路由對應同一個Action的總結

然後跨域請求的第一次Option請求傳回都是200,并且帶着剛剛紅框中的資訊。

轉載于:https://www.cnblogs.com/dcz2015/p/11323876.html