使用ASP.Net webapi的Angular.js $资源?

时间:2014-10-19 05:51:22

标签: javascript c# asp.net angularjs asp.net-web-api

我有一个简单的ASP.Net WebAPI服务,它在POST / PUT上分配一个静态变量并返回GET上的值:

private static State Repo = null;

public State Get()
{
    return Repo;
}

public void Post(State value)
{
    Repo = value;
}

public void Put(State value)
{
    Repo = value;
}

我有一个像这样定义的角度资源:

var stateService = angular.module('StateService', ['ngResource']);

stateService.factory('State', function ($resource) {
    return $resource('http://localhost:8080/API/State');
});

当我尝试这样做时:

State.get(function (state) {
    $scope.data = state.data !== undefined ? state.data : '[Not Set]';

    state.data = "newvalue";
    state.$save();
});

get()工作正常,但$save()在Chrome中引发此错误:

XMLHttpRequest cannot load http://localhost:8080/API/State. Invalid HTTP status code 405 

webAPI已启用CORS(返回Access-Control-Allow-Origin: *)。我错过了什么?

2 个答案:

答案 0 :(得分:3)

对于某些CORS请求,浏览器会在发送资源的实际请求之前发送一个名为“预检请求”的附加请求。

飞行前请求使用HTTP OPTIONS(405状态代码)方法。它包括两个特殊标题:

  • Access-Control-Request-Method:将用于的HTTP方法 实际的要求。
  • Access-Control-Request-Headers:请求列表 应用程序在实际请求上设置的标头。 (再次,这 不包括浏览器设置的标题。)

即使您已启用CORS,它也适用于GET请求,并且您已告知405 HTTP Status请求显示POST。这是因为,POST,PUT,DELETE请求不是安全请求,他们首先发送请求OPTIONS请求,您必须回复此请求,例如Access-Control-Allow-Origin: *Access-Control-Allow-Methods: POST和然后它会再次发送POST请求,然后就可以了。

请验证您要回复的标头是什么。即要成功CORS POST请求,至少您必须与Access-Control-Allow-Methods: POST一起发送Access-Control-Allow-Origin: *

启用CORS的步骤:

  1. 使用NuGet
  2. 安装 - 安装包Microsoft.AspNet.WebApi.Cors
  3. 打开文件App_Start / WebApiConfig.cs。将以下代码添加到WebApiConfig.Register方法。
  4. 接下来,将[EnableCors]属性添加到Controller类:

    以下参数

    [EnableCors(起源:“your_domain”,标题:“*”,方法:“POST”)]

  5. 重新部署您的WebAPI项目。

  6. 消息来源 - http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

    更多链接 - http://www.codeproject.com/Articles/742532/Using-Web-API-Individual-User-Account-plus-CORS-En

答案 1 :(得分:0)

在Web.config上,在

处注释<remove name="OPTIONSVerbHandler" />
<system.webServer>
  <handlers>

如果您使用的是web.config文件的CORS配置。