Asp.net web api WebAPI OWIN自托管CORS支持
我使用的是Microsoft.AspNet.WebApi V5.2.3、Microsoft.Owin.Host.HttpListener 3.0.1。从以下配置开始:Asp.net web api WebAPI OWIN自托管CORS支持,asp.net-web-api,cors,owin,self-hosting,Asp.net Web Api,Cors,Owin,Self Hosting,我使用的是Microsoft.AspNet.WebApi V5.2.3、Microsoft.Owin.Host.HttpListener 3.0.1。从以下配置开始: public void Configuration(IAppBuilder appBuilder) { HttpConfiguration config = new HttpConfiguration(); config.MapHttpAttributeRoutes(); appBuilder.UseWe
public void Configuration(IAppBuilder appBuilder)
{
HttpConfiguration config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
appBuilder.UseWebApi(config);
}
API控制器类的声明使用:
[EnableCors("*", "*", "*")]
public class CWebAPIController : ApiController
{
[Route("API/System/Login"), HttpGet]
public IHttpActionResult Login(string UserID, string Password)
{
.... bla bla bla .....
}
}
我可以在同一台计算机上使用HttpClent调用上面的API,但是如果我尝试从另一台计算机(在同一子网内)调用API,我会得到400个请求响应
我相信这是CORS的问题,但我可以知道如何解决这个问题。在谷歌上搜索会得到很多结果,而且WebApi的版本/实现太多了,我试了一整天都不知道哪一个是正确的
提前感谢您需要将Microsoft.Owin.Cors包,可能还有Microsoft.AspNet.Cors包引入您的项目,并在
启动
类中初始化Cors,如下所示:
var corsPolicy = new CorsPolicy
{
AllowAnyHeader = true,
AllowAnyMethod = true,
AllowAnyOrigin = true,
SupportsCredentials = true
};
corsPolicy.ExposedHeaders.Add("x-markit-currentpage");
corsPolicy.ExposedHeaders.Add("x-markit-totalpages");
corsPolicy.ExposedHeaders.Add("x-markit-totalresults");
app.UseCors(new CorsOptions
{
PolicyProvider = new CorsPolicyProvider { PolicyResolver = context => Task.FromResult(corsPolicy) }
});
public void Configuration(IAppBuilder app)
{
var config = ConfigureApi();
app.UseWebApi(config);
}
private HttpConfiguration ConfigureApi()
{
var config = new HttpConfiguration();
config.Routes.MapHttpRoute(
"DefaultApi",
"{controller}/{action}/{id}",
new { id = RouteParameter.Optional });
config.MessageHandlers.Add(new CorsMessageHandler ());
return config;
}
EnableCors属性应该适用于您的API控制器。或者,您可以执行以下操作之一 如果要允许从任何计算机访问,则可以使用
appBuilder.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
否则,如果您想控制允许使用的域/计算机,则使用
var cors = new EnableCorsAttribute("www.example.com", "*", "*");
config.EnableCors(cors);
您需要安装Microsoft.Owin.Cors软件包。对于自托管,我们需要在管理模式下运行下面的命令
netsh http add urlacl url=http://+:<port>/ user=<user id>
netsh http add urlacl url=http://+:/user=
我添加了如下COR:
var corsPolicy = new CorsPolicy
{
AllowAnyHeader = true,
AllowAnyMethod = true,
AllowAnyOrigin = true,
SupportsCredentials = true
};
corsPolicy.ExposedHeaders.Add("x-markit-currentpage");
corsPolicy.ExposedHeaders.Add("x-markit-totalpages");
corsPolicy.ExposedHeaders.Add("x-markit-totalresults");
app.UseCors(new CorsOptions
{
PolicyProvider = new CorsPolicyProvider { PolicyResolver = context => Task.FromResult(corsPolicy) }
});
public void Configuration(IAppBuilder app)
{
var config = ConfigureApi();
app.UseWebApi(config);
}
private HttpConfiguration ConfigureApi()
{
var config = new HttpConfiguration();
config.Routes.MapHttpRoute(
"DefaultApi",
"{controller}/{action}/{id}",
new { id = RouteParameter.Optional });
config.MessageHandlers.Add(new CorsMessageHandler ());
return config;
}
CorsMessageHandler出现在这里:
希望它能起作用