关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案
問題描述
當(dāng)跨域(cross domain)調(diào)用ASP.NET MVC或者ASP.NET Web API編寫的服務(wù)時,會發(fā)生無法訪問的情況。
重現(xiàn)方式
【備注】同樣的情況,也發(fā)生在ASP.NET MVC中。某些時候,MVC也可以直接用來開發(fā)服務(wù),與WebAPI相比各有優(yōu)缺點。下面是一個利用MVC開發(fā)的服務(wù)的例子
原因分析
跨域問題僅僅發(fā)生在Javascript發(fā)起AJAX調(diào)用,或者Silverlight發(fā)起服務(wù)調(diào)用時,其根本原因是因為瀏覽器對于這兩種請求,所給予的權(quán)限是較低的,通常只允許調(diào)用本域中的資源,除非目標(biāo)服務(wù)器明確地告知它允許跨域調(diào)用。
所以,跨域的問題雖然是由于瀏覽器的行為產(chǎn)生出來的,但解決的方法卻是在服務(wù)端。因為不可能要求所有客戶端降低安全性。
解決方案
針對ASP.NET MVC和ASP.NET Web API兩種項目類型,我做了一些研究,確定下面的方案是可行的。
針對ASP.NET MVC,只需要在web.config中添加如下的內(nèi)容即可
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="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,除了上面這樣的設(shè)置,還需要添加一個特殊的設(shè)計,就是為每個APIController添加一個OPTIONS的方法,但無需返回任何東西。
public string Options()
{
return null; // HTTP 200 response with empty body
}
【備注】這個功能也可以進(jìn)行一些研究,設(shè)計成Filter的形式可能就更好了。
總結(jié)
以上是生活随笔為你收集整理的关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: lucid是什么汽车品牌,lucid与特
- 下一篇: 比尔盖茨为什么辍学去创业 来看看他的故事