我的 web api 仅从 ajax 客户端给出 net:: ERR_CONNECTION_RESET 错误
Posted
技术标签:
【中文标题】我的 web api 仅从 ajax 客户端给出 net:: ERR_CONNECTION_RESET 错误【英文标题】:My web api gives net:: ERR_CONNECTION_RESET error only from ajax client 【发布时间】:2017-07-20 14:43:31 【问题描述】:我的 web api 在多个 IIS 中工作,当移动到 Azure VM 时,它在仅从 ajax 客户端调用时提供 net:: ERR_CONNECTION_RESET,但在使用 POSTMAN 时工作正常。
当从 ajax html 客户端点击时,它会在 OPTIONS 请求中显示 net:: ERR_CONNECTION_RESET。以为它没有到达服务器但是在引用时
中的http错误文件C:\Windows\System32\LogFiles\HTTPERR
显示
2017-07-20 12:54:06 210.18.173.26 54141 10.0.1.4 80 HTTP/1.1 OPTIONS /api/User/Method1 - 1 Request_Cancelled myappapipool
在 web.config 中
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Credentials" value="true" />
<add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS" />
我尝试在 web.config 中添加超时,但没有解决。还尝试将网络配置“Access-Control-Allow-Headers”值更改为“*”,它给出了预检请求错误。
由于相同的服务器和 ajax 客户端通信在其他 iis 中工作,我怀疑在位于 Azure VM 中的 IIS 中配置我的 web api 时我缺少一些可疑的东西。从 POSTMAN 或 android 客户端调用时,它与 IIS 中的现有配置一样工作。
非常感谢任何帮助/建议。
【问题讨论】:
When hitting from ajax html client it says net:: ERR_CONNECTION_RESET in OPTIONS request.
所有ajax html客户端和主流浏览器都会出现错误吗?或者出现在特定的客户端/浏览器上?
感谢您的评论,同样的错误出现在 Firefox 中。
只有 OPTIONS 请求返回错误?其他方法可以吗?
我实际上调用了 POST 方法,它在“OPTIONS”中返回此错误
您可以尝试使用包:Install-Package Microsoft.AspNet.WebApi.Cors。你可以关注这个帖子docs.microsoft.com/en-us/aspnet/web-api/overview/security/…
【参考方案1】:
HTTPErr 日志中出现 Request_Cancelled 是由 DynamicIPRestrictions Module 缓解 DDOS 攻击引起的。
如果您设置动态 IP 限制并将“拒绝操作类型”设置为 “中止请求”,请求将被中止并记录为 HTTPErr 日志中的“Request_Cancelled”
默认情况下,如果超过 5 个并发请求,动态 IP 地址限制可能会中止请求(检查服务器中的配置设置。)这可能是它适用于一台服务器而在 Azure 环境中不起作用的原因.更多详情请关注Security guidelines to detect and prevent DOS attacks targeting IIS/Azure Web Role (PAAS)
【讨论】:
【参考方案2】:由于多种原因,您会遇到此问题。 但在这种情况下,我假设您已经安装了 WebDAV,但有时它会与其他模块发生冲突。 因此,您最好先尝试删除该扩展程序。
【讨论】:
【参考方案3】:您在浏览器的控制台中看到了什么样的错误? 查看浏览器中的请求/响应标头值。有时配置未正确应用和/或浏览器需要其他标头。 有时,Allow-Headers 参数过于严格,请尝试使用它。
另外,它可以在所有浏览器上重现吗?
【讨论】:
【参考方案4】:这是我的 web config 配置,同时适用于 postman 和 chrome,你可以试一试:
<system.web>
<compilation debug="true" targetFramework="4.5.2" />
<httpRuntime targetFramework="4.5.2" />
<httpModules>
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" />
</httpModules>
</system.web>
<system.webServer>
<handlers>
<remove name="WebDAV" />
<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>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="true">
<remove name="WebDAVModule" />
<remove name="ApplicationInsightsWebTracking" />
<add name="ApplicationInsightsWebTracking" type="Microsoft.ApplicationInsights.Web.ApplicationInsightsHttpModule, Microsoft.AI.Web" preCondition="managedHandler" />
</modules>
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Content-Type" />
<add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
</customHeaders>
</httpProtocol>
</system.webServer>
希望对你有帮助!
【讨论】:
以上是关于我的 web api 仅从 ajax 客户端给出 net:: ERR_CONNECTION_RESET 错误的主要内容,如果未能解决你的问题,请参考以下文章
在仅从其他应用程序接收数据的 Web API 中使用啥类型的身份验证
向 web api 发送 ajax 请求时出现 401 Unauthorized