Asp.net web api WebAPI OWIN自托管CORS支持

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

我使用的是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.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出现在这里:

希望它能起作用