Web API 与 OWIN,预检请求 returns OK 但实际请求 returns 405。不允许 PUT、DELETE
Web API with OWIN, Preflight request returns OK but actual request returns 405. PUT, DELETE not allowed
真的被这个错误弄糊涂了。
我正在使用 Web Api 和 OAuth 进行用户身份验证。对站点的第一个请求是用户注册 POST 请求,该请求可以正确执行。
我发送的第二个请求是带有用于激活用户的用户凭据的 PUT 请求,为此预检请求 returns OK
但实际的 PUT 请求 returns 405
Method not Allowed 和没有 Access-Control-Allow-Origin
header 存在错误。
托管前一切正常。此错误仅发生在托管 API 中。我还使用 localhost:portNo/api
检查了托管客户端(即本地主机中的 运行 api 并从托管客户端应用程序访问它)并且它工作正常。错误仅发生在托管应用程序中。
预检要求如下:
Request URL: api.oorvalam.com/user/activate
Request Method:OPTIONS
Status Code:200 OK
预检响应如下:
接受:<em>/</em>
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,ta;q=0.6
Access-Control-Request-Headers:content-type, 用户语言
Access-Control-Request-Method:放
Cache-Control:no-cache
Connection:keep-还活着
Host:api.oorvalam.com
来源:<a href="http://web.oorvalam.com" rel="nofollow">http://web.oorvalam.com</a>
Pragma:no-缓存
Referer:web.oorvalam.com/setPassword
实际要求:
Request URL:api.oorvalam.com/user/activate
Request Method:PUT
Status Code:405 Method Not Allowed
实际响应如下:
Allow:GET, HEAD, OPTIONS, TRACE
Cache-Control:private
Content-Length:5293
Content-Type:text/html; charset=utf-8
Date:Mon, 19 Sep 2016 13:30:09 GMT
Server:Microsoft-IIS/8.5
X-Powered-By:ASP.NET
X-Powered-By-Plesk:PleskWin
仅供参考:客户端是用 angular 创建的。还删除了一些 http 链接,因为 Whosebug 不允许我这样做。
如果我错过了关于 CORS 的任何内容,请告诉我。并详细说明为什么它在本地工作而不在 Hosted api.
中工作
查了很多才知道是web.config配置的错误。
答案和这个答案类似
我在web.config最后的<web.server>
如下:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
</modules>
<handlers>
<remove name="OPTIONSVerbHandler"/>
<remove name="TRACEVerbHandler"/>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<httpErrors errorMode="Detailed"></httpErrors>
<asp scriptErrorSentToBrowser="true"></asp>
在我添加此配置之前不允许 PUT、DELETE。
真的被这个错误弄糊涂了。
我正在使用 Web Api 和 OAuth 进行用户身份验证。对站点的第一个请求是用户注册 POST 请求,该请求可以正确执行。
我发送的第二个请求是带有用于激活用户的用户凭据的 PUT 请求,为此预检请求 returns OK
但实际的 PUT 请求 returns 405
Method not Allowed 和没有 Access-Control-Allow-Origin
header 存在错误。
托管前一切正常。此错误仅发生在托管 API 中。我还使用 localhost:portNo/api
检查了托管客户端(即本地主机中的 运行 api 并从托管客户端应用程序访问它)并且它工作正常。错误仅发生在托管应用程序中。
预检要求如下:
Request URL: api.oorvalam.com/user/activate
Request Method:OPTIONS
Status Code:200 OK
预检响应如下:
接受:<em>/</em>
Accept-Encoding:gzip, deflate, sdch
Accept-Language:en-US,en;q=0.8,ta;q=0.6
Access-Control-Request-Headers:content-type, 用户语言
Access-Control-Request-Method:放
Cache-Control:no-cache
Connection:keep-还活着
Host:api.oorvalam.com
来源:<a href="http://web.oorvalam.com" rel="nofollow">http://web.oorvalam.com</a>
Pragma:no-缓存
Referer:web.oorvalam.com/setPassword
实际要求:
Request URL:api.oorvalam.com/user/activate
Request Method:PUT
Status Code:405 Method Not Allowed
实际响应如下:
Allow:GET, HEAD, OPTIONS, TRACE
Cache-Control:private
Content-Length:5293
Content-Type:text/html; charset=utf-8
Date:Mon, 19 Sep 2016 13:30:09 GMT
Server:Microsoft-IIS/8.5
X-Powered-By:ASP.NET
X-Powered-By-Plesk:PleskWin
仅供参考:客户端是用 angular 创建的。还删除了一些 http 链接,因为 Whosebug 不允许我这样做。
如果我错过了关于 CORS 的任何内容,请告诉我。并详细说明为什么它在本地工作而不在 Hosted api.
查了很多才知道是web.config配置的错误。
答案和这个答案类似
我在web.config最后的<web.server>
如下:
<system.webServer>
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule"/>
</modules>
<handlers>
<remove name="OPTIONSVerbHandler"/>
<remove name="TRACEVerbHandler"/>
<remove name="ExtensionlessUrlHandler-Integrated-4.0" />
<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
</handlers>
<httpErrors errorMode="Detailed"></httpErrors>
<asp scriptErrorSentToBrowser="true"></asp>
在我添加此配置之前不允许 PUT、DELETE。