【发布时间】: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 重现问题的步骤:
- 等待 5-10 分钟。
- 向包含大文件(本例中为 2 MB)的 /api/files 资源发送 POST 请求。
- 120 秒后发生超时。
- 只要只发送大的 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
问题
- 为什么会这样?
- 是否有任何不涉及“启动”API 的解决方法?可能是一个简单的 Web.config 设置?
如果需要更多信息,请告诉我!
【问题讨论】:
-
该博客对您的选择非常明确。 Azure 不会让您在添加 SSL 证书时设置
clientcertnegotiation=enable,因此启动连接几乎是您所能做的。如果有一个简单的设置,该博客可能会记录它;同样,如果原因很简单,博客可能会记录下来。我唯一可以建议的另一件事是向 Microsoft 提出支持票证/功能请求,以允许您在 Azure 门户中添加证书时指定clientcertnegotiation- 但这不太可能很快发生,如果有的话。
标签: c# asp.net ssl asp.net-web-api azure-web-app-service