c# - 使用客户端证书时,大型 POST 请求会导致 Asp.Net Web API 超时
问题描述
背景
我们的 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 App 并使用以下设置对其进行了配置。
使用 Postman 重现问题的步骤:
- 等待 5-10 分钟。
- 向包含大文件(本例中为 2 MB)的 /api/files 资源发送 POST 请求。
- 超时发生在 120 秒后。
- 只要你只发送大的 POST 请求,你就可以重复第 2 步。
请注意,我什至不必随此请求发送客户端证书即可发生问题。
不会出现问题
- 当需要客户端证书且仅 HTTPS 处于关闭状态时。
- 当您首先发送 GET /api/files 请求时,在 5-10 分钟内发送上面第 2 步中描述的相同 POST 请求。
可能的线索
在 Azure 中诊断 Web 应用程序后,我发现了这些请求生成的错误。我已经用谷歌搜索了这个描述,但没有找到任何可以解决我的问题的信息。
我发现了一些听起来相似的东西,但这篇文章听起来像是在客户端和 API 管理之间,而不是我们设置 SSL 证书的地方。寻找绿色提示框。
我还发现这篇文章包含一些解决问题的方法,但是用额外的请求“启动”API 似乎有点麻烦。
HTTPS 客户端证书请求在服务器处理大型 PUT/POST 请求时冻结
问题
- 为什么会这样?
- 是否有任何不涉及“启动”API 的解决方法?一个简单的 Web.config 设置可能吗?
如果需要更多信息,请让我现在!
解决方案
转到自定义域下的域,单击代理域名,然后勾选协商客户端证书选项。
如果您使用的是消费层,则启用请求客户端证书选项。
推荐阅读
- javascript - 从 ng-bootstrap 表中删除行
- batch-file - 我的批处理脚本在代码之后停止执行。命令
- python - 在 Python 中用对应的行值填充 NaN
- python - MongoDB如何获得评论+回复的数量
- python - 尝试创建自定义用户表单时在确认密码上出现 FieldError
- node.js - 图像文件的 AJAX 发布请求在 Express Route 处返回空
- node.js - 无法运行:npm start on react
- node.js - 安装 NVM(节点版本管理器)bash:第 5 行:npm:找不到命令时,Laravel Envoy 无法在 Ubuntu 上检测节点/npm
- vue.js - Vuejs 表单需要刷新才能让 router.push 工作
- unity3d - 如何统一使用 MapbBox 制作 2D 地图视图