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

时间:2017-01-16 08:07:50

标签: angularjs json asp.net-web-api cors

自从一周以来,我一直在努力解决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方法的问题。我能得到一些帮助吗?谁能告诉我我做错了什么?谢谢。

1 个答案:

答案 0 :(得分:2)

您的网络服务器上不允许使用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尝试。