c# - 使用客户端证书时,大型 POST 请求会导致 Asp.Net Web API 超时

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

背景

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

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

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

但是,在深入了解之后,很明显问题出在 API 管理和我们的 Web 应用程序之间,这是我们设置SSL 证书的地方。

问题

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

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

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

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

网络 API

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

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 应用程序并使用以下设置对其进行了配置。

Configuration - General settings

TLS/SSL settings - Protocol settings

使用 Postman 重现问题的步骤:

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

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

Postman request

不会出现这个问题

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

可能的线索

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

Diagnose and solve problems - Diagnose and solve problems - HTTP 4xx Errors

我发现了一些听起来相似的东西,但这篇文章听起来像是在客户端和 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 设置?

如果需要更多信息,请立即联系我!

最佳答案

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

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

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

关于c# - 使用客户端证书时,大型 POST 请求会导致 Asp.Net Web API 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59945532/

相关文章:

c# - 调用具有反射和配置依赖项的 DLL

asp.net - 有什么方法可以过滤 IIS 提供的页面中的某些内容吗?

javascript - 如何在页面 Page.IsPostBack 之后禁用 JavaScript 函数

ssl - 如何添加 CAA 记录?

PHP exec() 和 SSL

c# - 显示多列复选框列表

c# - 如何在自引用 linq 中获取针对高度父级的极端叶节点

c# - 查询文档并过滤嵌套字符串列表(即标签)中的特定值

asp.net - 链接到页面上的不同区域

ios - 在 RoR 应用程序上使用 Grocer gem 时,OpenSSL::PKey::RSAError(既不是 PUB key 也不是 PRIV key :嵌套的 asn1 错误)