mvc,web.api跨域。mvc主要用于搭建网站,webapi主要用于移动端请求接口。两者可以部署在一台服务器上。相同的域名,此时不存在跨域问题。当web.api域名不同时,就要跨域了。
跨域:在web.config的<system.webServer>下添加配置:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="http(s):xxx.xxx.xxx" />
<add name="Access-Control-Allow-Headers" value="content-type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE,OPTIONS" />
<add name="Access-Control-Allow-Credentials" value="true" />
</customHeaders>
</httpProtocol>
<handlers>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<remove name="OPTIONSVerbHandler" />
<remove name="WebDav" />
<remove name="TRACEVerbHandler" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
淌的水,踩的坑:
1.属性写为<add name="Access-Control-Allow-Origin" value="*" />:找了一圈,设置为* 意思是允许任何网站跨域请求,但在项目中却总是失败。可能是公司项目有过特殊处理,所以导致不能这么用。注:接口是有权限验证的,不登录是不能请求接口的,所以安全性问题不大。这个问题需要自己搭建一套体系去验证验证。欢迎大家验证后分享
2.<add name="Access-Control-Allow-Headers" value="*" />这个也是真的坑,完全没想到这个居然也不行。
3.<remove name="OPTIONSVerbHandler" />,没有这个iis服务器不处理options请求。注:简单请求如get可以直接跨域请求接口。但post等复杂接口在跨域请求之前会先发起options请求访问服务器,接到response来判断是否也以跨域。
4.公司服务器有开发环境,测试环境,http\https。总不能全在web.config中写死吧(据说是有中间件的,通过简单的标签就能实现跨域),而且发版的时候还要分测试环境、开发环境、线上环境,太麻烦了。所以把“Access-Control-Allow-Headers”属性放到了全局文件Global.asax.cs中,动态配置跨域链接。
protected void Application_BeginRequest(object sender, EventArgs e)
{
var req = System.Web.HttpContext.Current.Request;
if(Request.Headers.AllKeys.Contains("Origin"))
Response.Headers.Set("Access-Control-Allow-Origin", Request.Headers.Get("Origin"));
if (req.HttpMethod == "OPTIONS")//过滤options请求,用于js跨域
{
Response.StatusCode = 200;
Response.SubStatusCode = 200;
Response.End();
}
}
不过这样写后就相当于"Access-Control-Allow-Origin"属性设置成 "*"了。还需要更好的方法,欢迎大家留言献策。