Owin Self Host WebApi2 上的 CORS 错误

Posted

技术标签:

【中文标题】Owin Self Host WebApi2 上的 CORS 错误【英文标题】:CORS error on Owin Self Host WebApi2 【发布时间】:2014-08-14 07:37:06 【问题描述】:

我有一个 WebApi2 OWIN SelfHost 应用程序和一个 REST 方法。我对服务进行了 JQuery ajax 调用,但出现错误“No 'Access-Control-Allow-Origin'”,如下所示:

我已添加 Nuget 包“Microsoft.Owin.Cors”以启用 cors。

这是我的启动 API 代码:

app.Map("/api", apiApp =>

    var config = new HttpConfiguration();
    config.MapHttpAttributeRoutes();
    apiApp.UseWebApi(config);
    apiApp.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
);

我的 API 控制器类:

[RoutePrefix("car")]
[AllowAnonymous]
public class CarController : ApiController

我的 API 控制器方法:

[HttpGet]
[Route("get/id")]
public HttpResponseMessage Get(string id)

    var car = GetCars().Where(c => c.Id.Equals(id)).FirstOrDefault();
    return new HttpResponseMessage(HttpStatusCode.OK)
    
        Content = new ObjectContent<object>(new
        
            car
        , Configuration.Formatters.JsonFormatter)
    ;

这是我的 ajax 代码:

$.ajax(
    type: "GET",
    url: 'url.../api/car/get/6975908',
    headers: 
        'Access-Control-Allow-Origin': '*',         
        "X-Requested-With": "XMLHttpRequest"
    ,
    crossDomain: true,
    dataType: 'json',
    success: function (data) 
        if (data.Success) 
            alert(data.Content); //display success 
        
        else 
            alert(data.Message) //display exception
        

    ,
    error: function (XMLHttpRequest, textStatus, errorThrown) 
        alert(textStatus);
    
);

错误信息: “加载资源失败:服务器响应状态为 405(不允许方法) url.../api/car/get/6975908 XMLHttpRequest 无法加载 url.../api/car/get/6975908。请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问 Origin 'url...:62456'。"

此时我只需要开启CORS,不需要授权,我已经在控制器上设置了[AllowAnonymous]属性。可能是什么问题?

【问题讨论】:

【参考方案1】:

我发现了问题。 “UseCors”方法应该在启动类中的应用程序级别,而不是映射的 apiApp。请参阅下面的完整状态。

public class Startup

    public void Configuration(IAppBuilder app)
    
        //use cors on server level
        app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);

        app.Map("/api", apiApp =>
        
            var config = new HttpConfiguration();
            config.MapHttpAttributeRoutes();
            apiApp.UseWebApi(config);
        );
    

【讨论】:

以上是关于Owin Self Host WebApi2 上的 CORS 错误的主要内容,如果未能解决你的问题,请参考以下文章

Use OWIN to Self-Host ASP.NET Web API 2

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

使用 OData 响应 Owin Self-Host 忽略 Web Api 中的 Null 属性/值

用Web api /Nancy 通过Owin Self Host简易实现一个 Http 服务器

带有 OWIN 的 WebApi 2 - 授权挑战不会重定向到登录

Autofac 错误:无法加载文件或程序集 'System.Web.Http, Version=5.2.0.0,...' 我的项目是 Owin WebApi2 SelfHost