Asp.net mvc 获取和发布工作,但不在IIS 8.5服务器上删除

Asp.net mvc 获取和发布工作,但不在IIS 8.5服务器上删除,asp.net-mvc,angularjs,iis,asp.net-web-api,amazon-ec2,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 a

我正在从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>
网络配置:

[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>
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" />

尝试更改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" />

这里可能会发生两件事

首先

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

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

[HttpOptions, AllowAnonymous]
public IHttpActionResult Options()
{
    return StatusCode(HttpStatusCode.OK);
}
这是因为CORS将“预飞行”许多不是简单的get或post的请求

从有关该主题的mozilla文档中:

预检请求

与上面讨论的简单请求不同,“预飞行”请求优先 通过OPTIONS方法向上的资源发送HTTP请求 其他域,以确定实际请求是否安全 发送。跨站点请求是这样预处理的,因为它们可能 对用户数据有影响。特别是,请求是 如果:

它使用的方法不是GET、HEAD或POST。另外,如果POST用于 发送内容类型不是的请求数据 application/x-www-form-urlencoded、多部分/表单数据或text/plain, e、 g.如果POST请求使用 application/xml或text/xml,则请求被预引导

它在请求中设置自定义头(例如,请求使用头 例如X-ping(其他)

此外,localhost可能与CORS有问题。有一些变通方法可供开发,请参见:


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



它没有解释为什么GET和POST有效,而DELETE无效。As POST还发送飞行前请求。请看编辑1。我认为你的编辑不是问题所在。Post仅在某些条件下发送飞行前信息。您是否实现了选项动词?如果不是的话,不管怎样都需要,所以我们应该尝试一下。你能用fiddler观看请求吗?最好知道发送的是什么以及错误何时真正回来,因为它可能来自选项或delete方法。另外,options方法的匿名部分也很重要,它不会向options请求发送身份验证。options请求是200 OK,访问控制请求头:accept,authorization和访问控制请求方法:DELETE。但是实际的删除请求抛出403访问被拒绝。你能发布请求的javascript吗?可能由于其他原因,你得到了一个500内部服务器错误,请尝试更好地调查服务器上发生的情况,有时“访问控制允许源”错误会误导我在本地主机上尝试了相同的代码,并且有效,但在生产上失败了。OPTIONS request是200 OK,但DELETE request是403 Access Denied on production。我认为这与此有关-区别可能是您的本地环境中的模型与生产环境中的模型不同,因此,在生产环境中,您没有删除记录的权限请求甚至没有到达端点。我是本地和prod的管理员,并提供了所有访问权限。我认为,由于产品在AWS EC2上,可能存在一些防火墙问题。