我正在从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);
});
答案 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问题。有开发的解决方法,请参阅:
答案 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" />