通过微软的cors类库,让ASP.NET Web API 支持 CORS
2016-10-14 09:23
573 查看
1.创建WebAPI(myservice.azurewebsites.net)
这个简单放上图:1.1
1.2
1.3
1.4
1.5
1.6将下面的code替代原来的TestController
usingSystem.Net.Http; usingSystem.Web.Http; namespaceWebService.Controllers { publicclassTestController:ApiController { publicHttpResponseMessageGet() { returnnewHttpResponseMessage() { Content=newStringContent("GET:Testmessage") }; } publicHttpResponseMessagePost() { returnnewHttpResponseMessage() { Content=newStringContent("POST:Testmessage") }; } publicHttpResponseMessagePut() { returnnewHttpResponseMessage() { Content=newStringContent("PUT:Testmessage") }; } } }
1.7可以测试创建的WebAPI是否可以正常工作
2.创建Client端(myclilent.azurewebsites.net)
这也是可以简单上图:2.1
2.2
2.3找到Client端的Views/Home/Index.cshtml,用下面代码替代
<div>
<selectid="method">
<optionvalue="get">GET</option>
<optionvalue="post">POST</option>
<optionvalue="put">PUT</option>
</select>
<inputtype="button"value="Tryit"onclick="sendRequest()"/>
<spanid='value1'>(Result)</span>
</div>
@sectionscripts{
<script>
varserviceUrl='http://myservice.azurewebsites.net/api/test';//ReplacewithyourURI.
functionsendRequest(){
varmethod=$('#method').val();
$.ajax({
type:method,
url:serviceUrl
}).done(function(data){
$('#value1').text(data);
}).error(function(jqXHR,textStatus,errorThrown){
$('#value1').text(jqXHR.responseText||textStatus);
});
}
</script>
}
2.4用例外一个
3.WebAPI支持CORS
3.1打开VS,工具->库程序包管理器->程序包管理器控制台,输入下列命令:Install-PackageMicrosoft.AspNet.WebApi.Cors-Version5.0.0注意:目前Nuget上面最新的
Nuget科普link:
3.2打开WebApiConfig.Register添加config.EnableCors()
usingSystem.Web.Http;
namespaceWebService
{
publicstaticclassWebApiConfig
{
publicstaticvoidRegister(HttpConfigurationconfig)
{
//Newcode
config.EnableCors();
config.Routes.MapHttpRoute(
name:"DefaultApi",
routeTemplate:"api/{controller}/{id}",
defaults:new{id=RouteParameter.Optional}
);
}
}
}
3.3添加[EnableCors]特性到TestController
usingSystem.Net.Http;
usingSystem.Web.Http;
usingSystem.Web.Http.Cors;
namespaceWebService.Controllers
{
[EnableCors(origins:"http://myclient.azurewebsites.net",headers:"*",methods:"*")]
publicclassTestController:ApiController
{
//Controllermethodsnotshown...
}
}
3.4回到Client端,这时再次发送请求,会提示成功信息,证明CORS已经实现了。
4.为[EnableCors]设置到Action,Controller,Globally
4.1ActionpublicclassItemsController:ApiController
{
publicHttpResponseMessageGetAll(){...}
[EnableCors(origins:"http://www.example.com",headers:"*",methods:"*")]
publicHttpResponseMessageGetItem(intid){...}
publicHttpResponseMessagePost(){...}
publicHttpResponseMessagePutItem(intid){...}
}
4.2Controller
[EnableCors(origins:"http://www.example.com",headers:"*",methods:"*")]
publicclassItemsController:ApiController
{
publicHttpResponseMessageGetAll(){...}
publicHttpResponseMessageGetItem(intid){...}
publicHttpResponseMessagePost(){...}
[DisableCors]
publicHttpResponseMessagePutItem(intid){...}
}
4.3Globally
publicstaticclassWebApiConfig
{
publicstaticvoidRegister(HttpConfigurationconfig)
{
varcors=newEnableCorsAttribute("www.example.com","*","*");
config.EnableCors(cors);
//...
}
}
5.[EnableCors]工作原理
要跨域的请求
GEThttp://myservice.azurewebsites.net/api/testHTTP/1.1
Referer:http://myclient.azurewebsites.net/Accept:*/*
Accept-Language:en-US
Origin:http://myclient.azurewebsites.netAccept-Encoding:gzip,deflate
User-Agent:Mozilla/5.0(compatible;MSIE10.0;WindowsNT6.2;WOW64;Trident/6.0)
Host:myservice.azurewebsites.net
当发送请求的时候,浏览器会将“Origin”的请求头发送给
服务器的响应
HTTP/1.1200OK
Cache-Control:no-cache
Pragma:no-cache
Content-Type:text/plain;charset=utf-8
Access-Control-Allow-Origin:http://myclient.azurewebsites.netDate:Wed,05Jun201306:27:30GMT
Content-Length:17
GET:Testmessage
6.自定义CORSPolicyProviders
6.1除了使用自带的[EnableCors]特性外,我们可以自定义自己的[EnableCors]。首先是要继承Attribute和ICorsPolicyProvider[AttributeUsage(AttributeTargets.Method|AttributeTargets.Class,AllowMultiple=false)]
publicclassMyCorsPolicyAttribute:Attribute,ICorsPolicyProvider
{
privateCorsPolicy_policy;
publicMyCorsPolicyAttribute()
{
//CreateaCORSpolicy.
_policy=newCorsPolicy
{
AllowAnyMethod=true,
AllowAnyHeader=true
};
//Addallowedorigins.
_policy.Origins.Add("http://myclient.azurewebsites.net");
_policy.Origins.Add("http://www.contoso.com");
}
publicTask<CorsPolicy>GetCorsPolicyAsync(HttpRequestMessagerequest)
{
returnTask.FromResult(_policy);
}
}
实现后,可以添加自己定义的[MyCorsPolicy]
[MyCorsPolicy]
publicclassTestController:ApiController
{
..//
6.2或者你也可以从配置文件中读取允许的域名
publicclassCorsPolicyFactory:ICorsPolicyProviderFactory
{
ICorsPolicyProvider_provider=newMyCorsPolicyProvider();
publicICorsPolicyProviderGetCorsPolicyProvider(HttpRequestMessagerequest)
{
return_provider;
}
}
publicstaticclassWebApiConfig
{
publicstaticvoidRegister(HttpConfigurationconfig)
{
config.SetCorsPolicyProviderFactory(newCorsPolicyFactory());
config.EnableCors();
//...
}
}
相关文章推荐
- 通过微软的cors类库,让ASP.NET Web API 支持 CORS
- 通过微软的cors类库,让ASP.NET Web API 支持 CORS
- [CORS:跨域资源共享] 通过扩展让ASP.NET Web API支持W3C的CORS规范
- 使用ASP.NET Web API自带的类库实现对CORS的支持(在开发中使用这种方式)(转载)
- 通过扩展让ASP.NET Web API支持W3C的CORS规范(转载)
- 通过扩展让ASP.NET Web API支持W3C的CORS规范
- [CORS:跨域资源共享] 通过扩展让ASP.NET Web API支持JSONP
- 通过扩展让ASP.NET Web API支持W3C的CORS规范
- ASP.NET Web API自身对CORS的支持: CORS授权检验的实施
- 通过扩展让ASP.NET Web API支持JSONP
- 通过扩展让ASP.NET Web API支持JSONP -摘自网络
- [翻译]在ASP.NET Web API中通过OData支持查询和分页
- 通过扩展让ASP.NET Web API支持JSONP
- ASP.NET Web API自身对CORS的支持: CORS授权检验的实施
- ASP.NET Web API自身对CORS的支持:从实例开始
- ASP.NET Web API自身对CORS的支持: EnableCorsAttribute特性背后的故事
- 支持Ajax跨域访问ASP.NET Web Api 2(Cors)的示例教程
- ASP.NET Web API自身对CORS的支持:从实例开始
- ASP.NET Web API自身对CORS的支持:从实例开始
- ASP.NET Web API 支持 CORS