WebAPI OWIN SelfHosting CORS 支持

Posted

技术标签:

【中文标题】WebAPI OWIN SelfHosting CORS 支持【英文标题】:WebAPI OWIN SelfHosting CORS support 【发布时间】:2017-01-03 02:41:23 【问题描述】:

我正在使用 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 BadRequest 响应。

我相信这是 CORS 问题,但我想知道如何解决这个问题。在 google 中搜索会产生很多结果,并且 WebApi 的版本/实现太多了,尝试了一整天后我不知道哪个是正确的。

提前致谢

【问题讨论】:

【参考方案1】:

我添加了这样的cors:

    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 出现在这里: https://github.com/Microsoft/FetchClimate/blob/master/src/Service/Frontend/CORS/CorsMessageHandler.cs

希望它会起作用。

【讨论】:

【参考方案2】:

对于自托管,我们需要在管理员模式下运行以下命令。

netsh http add urlacl url=http://+:<port>/ user=<user id>

【讨论】:

【参考方案3】:

EnableCors 属性应该适用于您的 API 控制器。或者,您可以执行以下操作之一。

如果您想允许从任何计算机访问,那么您可以使用

appBuilder.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

否则,如果您想控制允许使用的域/计算机,则使用

var cors = new EnableCorsAttribute("www.example.com", "*", "*");
config.EnableCors(cors);

您需要安装 Microsoft.Owin.Cors 包。

【讨论】:

【参考方案4】:

您需要将 Microsoft.Owin.Cors 包,也许还有 Microsoft.AspNet.Cors 包引入您的项目,并在您的 Startup 类中初始化 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) 
            );

【讨论】:

以上是关于WebAPI OWIN SelfHosting CORS 支持的主要内容,如果未能解决你的问题,请参考以下文章

控制台+Owin搭建WebAPI接口服务

Webapi、Webhost和Owin的关系

[翻译]自托管WebApi使用OWIN和Unity

WebApi 上的 AngularJS 和 OWIN 身份验证

WebApi.Owin 中的 SuppressDefaultHostAuthentication 也抑制 webapi 外部的身份验证

WebAPI2 (OWIN) 上不允许使用 405 方法