Owin Self Host WebApi2上的CORS错误

时间:2014-06-24 06:37:45

标签: ajax cors asp.net-web-api owin

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

我添加了Nuget包" Microsoft.Owin.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);
    }
});

错误讯息: &#34;无法加载资源:服务器响应状态为405(方法不允许)url ... / api / car / get / 6975908 XMLHttpRequest无法加载url ... / api / car / get / 6975908。 No&#39; Access-Control-Allow-Origin&#39;标头出现在请求的资源上。起源&#39; url ...:62456&#39;因此不允许访问。&#34;

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

1 个答案:

答案 0 :(得分:3)

我发现了问题。 &#34; UseCors&#34;方法应该在启动类的应用程序级别,而不是映射的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);
        });
    }
}