Angular.js $resource 与 ASP.Net webapi?

Posted

技术标签:

【中文标题】Angular.js $resource 与 ASP.Net webapi?【英文标题】:Angular.js $resource with 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: *)。我错过了什么?

【问题讨论】:

【参考方案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 的步骤:

    安装这个 - 使用 NuGet 安装包 Microsoft.AspNet.WebApi.Cors 打开文件 App_Start/WebApiConfig.cs。将以下代码添加到 WebApiConfig.Register 方法中。

    接下来,将 [EnableCors] 属性添加到 Controller 类:

    有以下参数

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

    重新部署您的 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 请求,然后您必须响应上述标头,然后将工作。我已经回答了这个问题 - ***.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 配置。

【讨论】:

以上是关于Angular.js $resource 与 ASP.Net webapi?的主要内容,如果未能解决你的问题,请参考以下文章

angular.js $resources 设置授权头

angular-resource.js encodeUriSegment 问题

如何使用 angular.js-resource 启用 cors 请求

angular $resource delete 不会将正文发送到 express.js 服务器

Angular.js 和 DAO 模式

$resources