我的 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

如何仅从客户端使用 Mandrillapp API?

将字符串数组发布到 Web API 方法

如何在 ASP.NET Core Web API 中使用 LINQ 仅从数据库中获取最新的 id?

AJAX 成功调用仅从 JSON 字符串中获取一个值