11.24 ASP.NET實戰007:MVC解決跨域請求問題詳解

前面剛說到Vue實戰057:前端解決跨域問題詳解,今天順便把ASP.NET MVC的跨域解決方案也分享下。什麼是跨域問題這裡就不在複述了,前面已經解釋了很多次了,需要了解的可以參考Vue實戰057:前端解決跨域問題詳解,這裡主要說下在ASP.NET MVC中如何解決跨域請求問題。

​ASP.NET MVC項目跨域

ASP.NET MVC是Microsoft在WebForm框架的基礎上改進的一款Web開發框架,通過把項目分成Model、View和Controller幾個模塊將業務邏輯、數據、界面顯示等代碼進行組織分離,降低彼此間的耦合度,從而使系統更加靈活,易於擴展,也大大提高代碼的可重用性和開發效率。在ASP.NET MVC項目下我們也可以實現前後端分離項目,在Controller控制器中必須返回ActionResult類型,默認返回ViewResult視圖結果並將視圖呈現給網頁顯示。但是我們只希望其作為後臺接口為Vue提供後臺服務,這裡們就可以屏蔽掉返回ActionResult類型的方法,改用JsonResult等返回類型。

ASP.NET MVC常見的ActionResult衍生類型主要有:JsonResult(返回JSON格式內容)、FileResult(返回文件)、FilePathResult(返回文件路徑)、FileStreamResult(返回流文件)、EmptyResult(返回空值)、ContentResult(返回文本內容)、RedirectResult(重定向URL)、ViewResult(返回視圖)、JavaScriptResult(返回JavaScript代碼)等等,比如說我們用JsonResult定義一個簡單的用戶名和密碼驗證的接口(這裡沒有做數據庫驗證)。

前端這裡用Vue之前寫好的項目來測試,這裡我封裝了axios和api接口定義所以寫法可能不一樣。這裡需要注意的是ASP.NET MVC啟動的是http://localhost:56627/,所以在配置axios.defaults.baseURL屬性的時候要注意下,別寫成了"協議+IP+端口"形式這樣是訪問不到ASP.NET MVC後臺的。

接下來我們就要配置跨域訪問了,不然前端是無法訪問到我們的Login方法。ASP.NET MVC配置跨域最簡單的方法就是在Web.config文件中添加應用程序配置,在configuration中添加如下配置前臺即可跨域訪問到網站數據。Access-Control-Allow-Origin設置為*表示允許所有域名,如要設置特定的域名,可以填寫具體域名。

如果你想實現指定Controller或Action允許跨域訪問,那麼我們就可以在App_Start封裝一個跨域類AllowOrigin,獲取當前請求的源地址,並指定該地址添加Access-Control-Allow-Origin屬性,再分別定義兩個針對Controller或Action定義屬性的類,當其被指定需跨域時調用AllowOrigin中的addOrigin方法為其添加Access-Control-Allow-Origin屬性。

如何在指定的位置配置允許跨域訪問,引入using WebApplication3.App_Start;在需要允許跨域的Controller前添加[ControllerAllowOrigin(AllowSites = new string[] { "http://localhost:1527" })],在需要允許跨域的Action前添加[ActionAllowOrigin(AllowSites = new string[] { "http://localhost:1527" })]即可。

ASP.NET Web API項目跨域

Web API是一款借鑑了RESTful風格的輕型框架,用於構建基於 HTTP 的服務,它與 ASP.NET MVC應用程序的工作方式大致相同,直接返回用戶的數據請求而不是視圖。Web API提供了針對其跨域設置的插件:Microsoft.AspNet.WebApi.Cors。在工具->NuGet包管理器->管理解決方案的NuGet程序包中搜索下載插件Microsoft.AspNet.WebApi.Cors,或者在工具->NuGet包管理器->程序包管理器控制檯窗口中輸入命令:Install-Package Microsoft.AspNet.WebApi.Cors安裝最新的包和更新相關的依賴項。

ASP.NET Web API在App_Start 目錄下提供了WebApiConfig.cs配置文件,我們在WebApiConfig.cs文件中的Register方法中添加跨域配置:config.EnableCors(new EnableCorsAttribute("*", "*", "*"));就可以實現全局跨域配置了,如果你想在每個Controller或Action啟用CORS就可以只啟用跨域功能config.EnableCors(),具體的跨域配置可以在指定的Controller或Action中配置。

然後我們在控制器中添加EnableCors屬性來針對每個Controller或者每個Action進行跨域訪問配置,如果您設置EnableCors屬性在Controller控制器,那麼該控制器下的所有Action都支持跨域。如果想對某一個Action禁用跨域,可以使用[DisableCors]特性類屏蔽。如果你設置EnableCors屬性在Controller上則只有該方法允許跨域(需引入空間名:using System.Web.Http.Cors;)。

注意事項:該方法中的Controller繼承至ApiController而非Controller,Microsoft.AspNet.WebApi.Cors是針對繼承ApiController的控制器生效,對繼承Controller的控制器無效!

更多ASP.NET實戰實戰技巧可參考專欄:ASP.NET MVC實戰系列