【问题标题】:Angular.js $resource with ASP.Net webapi?Angular.js $resource 与 ASP.Net webapi?
【发布时间】:2014-12-14 09:06:54
【问题描述】:

我有一个简单的 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: *)。我错过了什么?

【问题讨论】:

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


    【解决方案1】:

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

    pre-flight 请求使用 HTTP OPTIONS(405 状态码)方法。它包括两个特殊的标题:

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

    即使您已启用 CORS,并且它适用于 GET 请求,并且您已告知它正在为 POST 请求显示 405 HTTP Status。这是因为,POST,PUT,DELETE 请求不是安全请求,他们首先发送请求 OPTIONS 请求,您必须响应 Access-Control-Allow-Origin: *Access-Control-Allow-Methods: POST 等所需的 hedaers,然后它会再次发送 POST请求,然后它将起作用。

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

    启用 CORS 的步骤:

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

      有以下参数

      [EnableCors(origins: "your_domain", headers: "*", methods: "POST")]

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

    来源 - 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

    【讨论】:

    • 对于 CORS 请求,PUT、POST、DELETE 不起作用,直截了当,它会首先向您发送 405 OPTIONS 请求,然后您必须响应上述标头,然后将工作。我已经回答了这个问题 - stackoverflow.com/questions/25889599/…,但这是给 WCF 的,我正在寻找 WebAPI,很快就会发布。你也发送这个 Access-Control-Allow-Methods: POST 标头吗?
    • 有没有办法从 IIS 做到这一点?我尝试将它们添加到 IIS,但它们没有效果。但是,当我将它们添加到 webAPI 代码中时,它们就像一个魅力。
    • 你需要给post方法设置一些属性,比如methodsheaders,那么它应该可以工作。
    • 谢谢,试试看! :)
    • @ArindamNayak,如果 CORS 由 EnableCorsAttribute("*", "*", "*"); 启用,那么是否必须明确指定“POST”?另外,我尝试在 web.config 中启用它,但这不起作用.. 有什么解释吗?
    【解决方案2】:

    在 Web.config 上,在

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

    如果您通过 web.config 文件使用 CORS 配置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-06
      • 2016-07-01
      • 1970-01-01
      • 2015-05-13
      • 1970-01-01
      • 2012-07-06
      • 2014-05-29
      相关资源
      最近更新 更多