Cors 不适用于删除和放入 web api2

Posted

技术标签:

【中文标题】Cors 不适用于删除和放入 web api2【英文标题】:Cors not working for Delete and Put in web api2 【发布时间】:2017-05-31 00:37:37 【问题描述】:

一周以来,我一直在 CORS 问题上苦苦挣扎。我正在使用 web api2 编写 web 服务。我创建了一个控制器(用于基本的 crud 操作)并托管在服务器 192.168.0.213:8041/api/user_creation 中,我创建了另一个 mvc5 应用程序并托管在与 http://192.168.0.213:8040/usercreation/Index 相同的服务器中。我已经使用下面的链接启用了 cors。

http://www.c-sharpcorner.com/UploadFile/009ee3/implementation-of-cross-origin-request-in-Asp-Net-web-api-2/

我正在使用 angularjs 来获取如下服务。我能够从服务器获取数据,也能够将数据推送到服务器。所以我的 GET 和 POST 动词工作正常。每当我尝试更新和删除时,我都会遇到问题并收到以下错误消息。

Failed to load resource: the server responded with a status of 405 (Method Not Allowed)  http://192.168.0.213:8041/User_Creation/1020
XMLHttpRequest cannot load http://192.168.0.213:8041/User_Creation/1020. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://192.168.0.213:8040' is therefore not allowed access. The response had HTTP status code 405.

我正在使用 angularjs 来调用 Web 服务,如下所示。 例如更新,

this.update = function (sub) 
        var url = 'http://192.168.0.213:8041/User_Creation/' + sub.user_id;
        return $http(
            method: 'put',
            data: JSON.stringify(sub),
            url: url,
            contentType: "application/json"
        );
    

对于删除,

this.deleteSubscriber = function (user_id) 
        var url = 'http://192.168.0.213:8041/User_Creation/' + user_id;
        return $http.delete(url).then(function (response) 
            return response.data;
        );
    

我从 Web Api 接收 json 格式的数据,所以我在 global.asx 中添加了以下代码。 GlobalConfigGl​​obalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings

.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
        GlobalConfiguration.Configuration.Formatters
            .Remove(GlobalConfiguration.Configuration.Formatters.XmlFormatter);

这是我在 web.config 中的处理程序代码

<handlers>
      <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
      <remove name="OPTIONSVerbHandler" />
      <remove name="TRACEVerbHandler" />
      <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
    </handlers>

以下是请求和响应数据。

   Request URL: http://192.168.0.213:8041/User_Creation/1021
   Request Method: DELETE
   Status Code: 405 / Method Not Allowed
 - Request Headers
   Accept: application/json, text/plain, */*
   Accept-Encoding: gzip, deflate
   Accept-Language: en-US
   Cache-Control: no-cache
   Connection: Keep-Alive
   Content-Length: 0
   Host: 192.168.0.213:8041
   Referer: http://192.168.0.213:8040/usercreation/Index
   User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko
 - Response Headers
   Allow: GET, HEAD, OPTIONS, TRACE
   Content-Length: 1293
   Content-Type: text/html
   Date: Mon, 16 Jan 2017 08:34:30 GMT
   Server: Microsoft-IIS/8.5
   X-Powered-By: ASP.NET

我在使用 PUT 和 Delete 方法时遇到问题。我可以得到一些帮助吗?有人可以告诉我我在哪里做错了吗?谢谢。

【问题讨论】:

检查响应头中的Access-Control-Allow-Methods 谢谢。当我点击删除时,我会得到一些细节。我在上面发布了,但我不明白我错过了什么。 您能展示您的 Web API 控制器操作吗? 我将控制器装饰如下。 [EnableCors(origins: "192.168.0.213:8040", headers: "Content-Type", methods: "GET, POST, PUT, DELETE, OPTIONS")] 下面是我的 put 和 delete 方法。 public IHttpActionResult Put(int id, Noor_Users users) [AcceptVerbs("DELETE")] public IHttpActionResult Delete(int id) . 在响应头中我只能看到允许:GET、HEAD、OPTIONS、TRACE。所以我这里没有 PUT 和 delete ?所以这在这里造成了问题? 【参考方案1】:

您的 Web 服务器上似乎不允许使用 PUTDELETE 动词,并且您遇到的问题与 CORS 完全无关。您可能需要检查几件事以确保首先允许这些动词。在尝试进行跨域 AJAX 调用之前,请确保您可以对 Web API 进行标准 HTTP 调用并且它可以响应这些动词。

所以在你的 web.config 中你可能有这样的东西:

add name="ExtensionlessUrl-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

注意这里没有PUTDELETE 动词。

还要确保您已从 web.config 中删除所有 WebDAVWebDAVModule 跟踪,因为这可能会干扰您的请求:

<modules runAllManagedModulesForAllRequests="true">
    <remove name="WebDAVModule"/>
</modules>

现在您可以使用 Postman 或 Fiddler 使用 PUT 和 DELETE 动词成功调用您的 Web API 端点,您可以返回到 javascript 尝试。

【讨论】:

谢谢。我会把我拥有的东西放在处理程序中。 您尝试添加&lt;remove name="WebDAVModule"/&gt; 行吗? 我刚刚更改为verb="GET,HEAD,POST,PUT,DELETE,DEBUG",现在开始正常工作并且发布不工作和删除。 现在我所有的动词在 IE 中都可以正常工作,但在 chrome 中却不行。 从 Postman/Fiddler 调用时,PUT 和 DELETE API 端点是否正常工作?

以上是关于Cors 不适用于删除和放入 web api2的主要内容,如果未能解决你的问题,请参考以下文章

通过 Web.config 启用 CORS 不适用于 .net WebApi

.NET Web API CORS 不适用于所有路由

启用 CORS 不适用于 Spotify Web API [重复]

CORS 不适用于 ASP NET 5 Web Api

Cors 在 web api2 项目中不起作用

多个 CORS 适用于 GET 但不适用于 PUT/POST 与飞行前请求 Web api 2