【问题标题】:Large POST requests causes timeout in Asp.Net Web API when using client certificates使用客户端证书时,大型 POST 请求会导致 Asp.Net Web API 超时
【发布时间】:2020-01-28 09:22:15
【问题描述】:

背景

我们的 API 允许用户上传大文件,例如 PDF、JPG 和 PNG。最近,当服务器空闲一段时间时,我们遇到了大量请求超时。我们的客户会经历 2 分钟的等待时间,然后收到 500 错误消息。

我们使用 Azure API 管理为客户提供文档和 API 访问权限。

客户端 -> API 管理 -> Web 应用程序

但是,在查看洞察之后,很明显问题出在 API 管理和我们的 Web 应用之间,我们在其中设置了 SSL 证书

问题

问题似乎是发送包含 SSL 证书的大型 POST 请求以“唤醒”API 使其陷入僵局。我也使用应用程序洞察力调试了 API,但似乎任何操作都没有收到请求。

在使用全新的 Web API 项目和 Web 应用程序调试问题后,我将其缩小到仅在以下情况下才会发生超时:

  • 服务器配置为仅使用 HTTPS 和/或需要客户端证书。
  • 在发送我的第一个请求之前,我让服务器等待 5-10 分钟。
  • 我的第一个请求包含一个大文件,例如 2 MB PDF 文件。

为了调试问题,我设置了以下资源。

网络 API

我创建了一个全新的项目,ASP.NET Web API,框架 4.6。我只添加了一个简单的文件控制器。

using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace DebugCertificate.API.Controllers
{
    public class FilesController : ApiController
    {

        public HttpResponseMessage Post()
        {
            // Success
            return Request.CreateResponse(HttpStatusCode.OK, "Welcome to the POST files resource!");
        }

        public HttpResponseMessage Get()
        {
            // Success
            return Request.CreateResponse(HttpStatusCode.OK, "Welcome to the GET files resource!");
        }

    }
}

网络应用

我设置了一个全新的 Azure Web 应用并使用以下设置对其进行了配置。

使用 Postman 重现问题的步骤:

  1. 等待 5-10 分钟。
  2. 向包含大文件(本例中为 2 MB)的 /api/files 资源发送 POST 请求。
  3. 120 秒后发生超时。
  4. 只要只发送大的 POST 请求,就可以重复第 2 步。

请注意,我什至不必随此请求发送客户端证书,问题就会发生。

问题不会发生

  • 当需要客户端证书且仅 HTTPS 处于关闭状态时。
  • 当您首先发送 GET /api/files 请求并在 5-10 分钟内发送上述步骤 2 中描述的相同 POST 请求。

可能的线索

在 Azure 中诊断 Web 应用程序后,我发现了这些请求生成的错误。我已经用谷歌搜索了这个描述,但没有找到任何可以解决我的问题的信息。

我发现了一些听起来相似的东西,但这篇文章听起来像是在客户端和 API 管理之间,而不是我们设置 SSL 证书的地方。寻找绿色的提示框。

How to secure APIs using client certificate authentication in API Management

我还发现这篇文章包含一些解决问题的方法,但是用一个额外的请求“启动”API 似乎有点麻烦。

HTTPS Client Certificate Request freezes when the Server is handling a large PUT/POST Request

问题

  1. 为什么会这样?
  2. 是否有任何不涉及“启动”API 的解决方法?可能是一个简单的 Web.config 设置?

如果需要更多信息,请告诉我!

【问题讨论】:

  • 该博客对您的选择非常明确。 Azure 不会让您在添加 SSL 证书时设置 clientcertnegotiation=enable,因此启动连接几乎是您所能做的。如果有一个简单的设置,该博客可能会记录它;同样,如果原因很简单,博客可能会记录下来。我唯一可以建议的另一件事是向 Microsoft 提出支持票证/功能请​​求,以允许您在 Azure 门户中添加证书时指定 clientcertnegotiation - 但这不太可能很快发生,如果有的话。

标签: c# asp.net ssl asp.net-web-api azure-web-app-service


【解决方案1】:

在自定义域下转到您的域,单击代理域名,然后勾选协商客户端证书选项。

如果您使用的是消费层,则启用请求客户端证书选项。

https://docs.microsoft.com/en-us/azure/api-management/api-management-howto-mutual-certificates-for-clients

【讨论】:

  • 上周我试过了,但结果没有改变。将请求从 API 管理发送到后端 Web 应用程序时会出现此问题。据我了解,此设置仅在客户端和 API 管理之间协商客户端证书。请注意,我可以在不涉及 API 管理的情况下重新创建问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
相关资源
最近更新 更多