最近公司讓寫一個內部專案 簡單的附件上傳,就想自己搭建一套MVC框架
一個是MVC 一個是WEB API
問題描述
當跨域(cross domain)呼叫ASP.NET MVC或者ASP.NET Web API撰寫的服務時,會發生無法訪問的情況,
重現方式
-
使用模板創建一個最簡單的ASP.NET Web API專案,除錯起來確認能正常作業

-
創建另外一個專案,僅僅包含一個HTML頁面,發起AJAX的呼叫

-
在瀏覽器中打開這個網頁,我們會發現如下的錯誤(405:Method Not Allowed)

【備注】同樣的情況,也發生在ASP.NET MVC中,某些時候,MVC也可以直接用來開發服務,與WebAPI相比各有優缺點,下面是一個利用MVC開發的服務的例子

原因分析
跨域問題僅僅發生在Javascript發起AJAX呼叫,或者Silverlight發起服務呼叫時,其根本原因是因為瀏覽器對于這兩種請求,所給予的權限是較低的,通常只允許呼叫本域中的資源,除非目標服務器明確地告知它允許跨域呼叫,
所以,跨域的問題雖然是由于瀏覽器的行為產生出來的,但解決的方法卻是在服務端,因為不可能要求所有客戶端降低安全性,
解決方案
針對ASP.NET MVC和ASP.NET Web API兩種專案型別,我做了一些研究,確定下面的方案是可行的,
針對ASP.NET MVC,只需要在web.config中添加如下的內容即可
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="https://www.cnblogs.com/syykk123123/archive/2020/12/02/*" />
<add name="Access-Control-Allow-Headers" value="https://www.cnblogs.com/syykk123123/archive/2020/12/02/Content-Type" />
<add name="Access-Control-Allow-Methods" value="https://www.cnblogs.com/syykk123123/archive/2020/12/02/GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>
針對ASP.NET Web API,除了上面這樣的設定,還需要添加一個特殊的設計,就是為每個APIController添加一個OPTIONS的方法,但無需回傳任何東西,
public string Options()
{
return null; // HTTP 200 response with empty body
}
2:如何設定路由
我的Web.API路由問題,我有以下兩條路線:
config.Routes.MapHttpRoute(
name: "MethodOne",
routeTemplate: "api/{controller}/{action}/{id}/{type}",
defaults: new { id = RouteParameter.Optional, type = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "MethodTwo",
routeTemplate: "api/{controller}/{action}/{directory}/{report}",
defaults: new { directory = RouteParameter.Optional, report = RouteParameter.Optional }
);
在我的控制器這兩個方法:
[HttpGet]
[ActionName("methodone")]
public string MethodOne(string id, string type)
{
return string.Empty;
}
[HttpGet]
[ActionName("methodtwo")]
public string MethodTwo(string directory, string report)
{
return string.Empty;
}
我用的最笨的方法,每個action 都注冊了一個路由
別忘記默認路由不要注釋
3:跨域405(Method Not Allowed)問題
ajax post沒有問題,多個GET方法,options過不去,顯示Response for preflight has invalid http status code 405

在global中處理下option
protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.End();
}
}
另外,還要注意header的設定,多個允許的自定義header逗號隔開,不然也會被拒絕,
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="https://www.cnblogs.com/syykk123123/archive/2020/12/02/*" />
<add name="Access-Control-Allow-Headers" value="https://www.cnblogs.com/syykk123123/archive/2020/12/02/Content-Type,Token" />
<add name="Access-Control-Allow-Methods" value="https://www.cnblogs.com/syykk123123/archive/2020/12/02/GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
如果還有不明白 請參考下面三個
參考 檔案 https://www.cnblogs.com/chenxizhang/p/3821703.html
https://www.cnblogs.com/stoneniqiu/p/9034535.html
http://www.voidcn.com/article/p-avezrrbv-btd.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/228260.html
標籤:.NET技术
上一篇:HTTP 錯誤 404.3 - Not Found由于擴展配置問題而無法提供您請求的頁面。如果該頁面是腳本,請添加處理程式。如果應下載檔案,請添加 MIME 映射
