GET和POST工作但不在IIS 8.5服务器上删除

时间:2015-03-23 18:20:13

标签: asp.net-mvc angularjs iis asp.net-web-api amazon-ec2

我正在从AngularJS应用程序发送删除请求到asp.net web api,我收到以下错误 -

XMLHttpRequest cannot load http://api.prod.com/api/v1/proddetails/34. No   
'Access-Control-Allow-Origin' header is present on the requested resource. 
Origin 'http://localhost:5100' is therefore not allowed access. The response     
had HTTP status code 403.

方式:

[HttpDelete]
public HttpResponseMessage Delete(int id)

网络配置:

<system.webServer>
<validation validateIntegratedModeConfiguration="false" />

<modules runAllManagedModulesForAllRequests="true">
  <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
  <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
  <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
  <remove name="WebDAVModule" />
</modules>

<security>
  <requestFiltering>
    <requestLimits maxAllowedContentLength="12582912" />
    <!--12 MB-->
  </requestFiltering>
</security>
<handlers>
  <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
  <remove name="OPTIONSVerbHandler" />
  <remove name="TRACEVerbHandler" />
  <remove name="WebDAV" />
  <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
</system.webServer>

请帮忙。

注意:该计算机是在AWS EC2上运行IIS 8.5的Windows Server 2012 R2。我在控制器上正确安装了CORS -

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

EDIT1

我正在查看我的applicationHost.config文件,它有这些行 -

<add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG" modules="IsapiModule" scriptProcessor="C:\windows\Microsoft.NET\Framework64\v4.0.30319\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />

但是它们中有这么多,并且它们都没有DELETE作为允许的动词。这会引起问题吗?

EDIT2

根据要求,这是AngularJS请求代码 -

$http.delete('http://api.prod.com/api/v1/proddetails/' + data)
                .success(function (data, status, headers, config) {
                    console.log(data);
                    if(data.status == "200")
                    {
                        console.log('data deleted');
                    }
                    deferred.resolve(data);
                })
                .error(function (data, status, headers, config) {
                    console.log("some error occurred");
                    deferred.reject(data);
                });

3 个答案:

答案 0 :(得分:0)

尝试更改Web.config的此属性:

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

答案 1 :(得分:0)

这里可能会发生两件事。

<强>第一

在IIS中,如果单击最根节点(计算机名称),则可以在右侧框架中看到一个名为“功能委派”的图标。双击打开它。从那里,您将看到一个委托列表,找到Handler Mappings并确保它被设置为读/写。这将允许站点覆盖可能不允许DELETE谓词的默认处理程序。然后确保web.config反映了你想为extensionlessurlhandler启用的动词。

<强>第二

您必须在API控制器上实现选项动词,如下所示:

[HttpOptions, AllowAnonymous]
public IHttpActionResult Options()
{
    return StatusCode(HttpStatusCode.OK);
}

这是因为CORS会在飞行前#34;许多请求不是简单的获取或发布。

来自关于该主题的mozilla文档:

  

预检请求

     

与简单请求(如上所述)不同,&#34;预先发布&#34;首先要求   通过OPTIONS方法向该资源发送HTTP请求   其他域,以确定实际请求是否安全   发送。跨站请求是这样的预检,因为它们可能   对用户数据有影响。特别是,请求是   预防如果:

     

它使用GET,HEAD或POST以外的方法。此外,如果使用POST   使用除以外的Content-Type发送请求数据   application / x-www-form-urlencoded,multipart / form-data或text / plain,   例如如果POST请求使用XML向服务器发送XML有效负载   application / xml或text / xml,然后请求被预检。

     

它在请求中设置自定义标头(例如,请求使用标头   比如X-PINGOTHER)

此外,localhost可能存在CORS问题。有开发的解决方法,请参阅:

Deadly CORS when http://localhost is the origin

答案 2 :(得分:0)

更改applicationHost.config文件中的以下标记:

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