- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 Azure Web 应用程序上托管了 ASP.NET Core 2.1 应用程序。我通过 WebSockets 发送照片 base64 字符串,然后通过 HttpClient 发送到 Azure Face API。
在大约 150-250 个请求后,HttpClient 停止响应,我无法在我的应用程序的任何部分使用 HttpClient 类。
在我的本地主机上它工作正常,我从来没有遇到过这个问题。
public class FaceApiHttpClient
{
private HttpClient _client;
public FaceApiHttpClient(HttpClient client)
{
_client = client;
}
public async Task<string> GetStringAsync(byte[] byteData,string uri)
{
using (ByteArrayContent content = new ByteArrayContent(byteData))
{
content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
HttpResponseMessage response = await _client.PostAsync(uri, content).ConfigureAwait(false);
return await response.Content.ReadAsStringAsync().ConfigureAwait(false);
}
}
}
DI:
services.AddHttpClient<FaceApiHttpClient>(
client => {
client.BaseAddress = new Uri("xxx");
client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", "xxx");
});
FaceApiClient 的方法在 Scoped Service 中调用:
public interface IFaceAPIService
{
Task<DataServiceResult<List<Face>>> GetFacesDataFromImage(byte[] byteArray);
}
public class FaceAPIService: ServiceBase, IFaceAPIService
{
private readonly IServerLogger _serverLogger;
private FaceApiHttpClient _httpClient;
//Consts
public const string _APIKey = "xxx";
public const string _BaseURL = "xxx";
public FaceAPIService(IServerLogger serverLogger, FaceApiHttpClient client)
{
_serverLogger = serverLogger;
_httpClient = client;
}
public async Task<DataServiceResult<List<Face>>> GetFacesDataFromImage(byte[] byteData)
{
try
{
// Request parameters. A third optional parameter is "details".
string requestParameters = "returnFaceId=true&returnFaceLandmarks=false&returnFaceAttributes=age,gender,headPose,smile,facialHair,glasses,emotion,hair,makeup,occlusion,accessories,blur,exposure,noise";
// Assemble the URI for the REST API Call.
string uri = _BaseURL + "/detect" + "?" + requestParameters;
var result = await _httpClient.GetStringAsync(byteData, uri).ConfigureAwait(false);
List<Face> faces = JsonConvert.DeserializeObject<List<Face>>(result);
return Success(faces);
}
catch (Exception ex)
{
_serverLogger.LogExceptionFromService(ex);
return DataServiceResult.ErrorResult<List<Face>>(ex.Message);
}
}
}
a) 在本地主机环境中它可以工作。我运行 11 个模拟器,每秒有很多请求,而且它从未中断(10 个小时的模拟器,超过 20k 个请求)。
b) HttpClient 停止在应用程序的任何部分工作,而不仅仅是在一个类中。
如何解决这个问题?
最佳答案
考虑稍微改变一下设计。
使用类型化客户端的假设是它的配置不会经常更改,并且应该在注册类型化客户端时添加一次。
services.AddHttpClient<FaceApiHttpClient>(_ => {
_.BaseAddress = new Uri(Configuration["OcpApimBaseURL"]);
var apiKey = Configuration["OcpApimSubscriptionKey"];
_.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", apiKey);
_.Timeout = new TimeSpan(0, 0, 10);
});
这将允许键入的客户端不必为每次调用添加 key
public class FaceApiHttpClient {
private readonly HttpClient client;
public FaceApiHttpClient(HttpClient client) {
this.client = client;
}
public async Task<string> GetStringAsync(byte[] byteData, string uri) {
using (var content = new ByteArrayContent(byteData)) {
// This example uses content type "application/octet-stream".
// The other content types you can use are "application/json" and "multipart/form-data".
content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
// Execute the REST API call.
HttpResponseMessage response; response = await _client.PostAsync(uri, content).ConfigureAwait(false);
// Get the JSON response.
return await response.Content.ReadAsStringAsync().ConfigureAwait(false);
}
}
}
需要注意的是ASP.NET Core 2.1-preview1: Introducing HTTPClient factory
A typed client is, effectively, a transient service, meaning that a new instance is created each time one is needed and it will receive a new HttpClient instance each time it is constructed. This means that the configuration func, in this case retrieving the URI from configuration, will run every time something needs a
FaceApiHttpClient
.
根据以前的文档,创建那么多客户端会带来问题,但这里的假设是此新功能的开发人员在设计时考虑到了这一点。
之所以这样说,是因为您描述的问题与之前的问题相似,原因相同。
关于c# - ASP .NET Core 2.1-preview2 HttpClient 死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49831568/
我有 ADT 版本 23.0.4 并安装了 Android 5.0 的 SDK 平台。 我读到 Android 5.0 Lolipop 的 API 级别为 21。但是在 Eclipse 的“新建应用程
视频,电子表格和文档支持在云端硬盘中预览其内容。我正在开发一个Google云端硬盘应用程序,我希望它支持预览其内容,因此Google云端硬盘中是否有任何api可以设置预览缩略图或将其嵌入其中?例如,在
似乎预览停止在Xcode 12上运行!尝试预览SwiftUI文件模板并出现以下错误。任何想法如何解决这一问题?试图清理构建文件夹,删除派生数据并重新启动Xcode无济于事! 在Catalina 10.
我有一个需要预览网络摄像头视频的 Directshow 应用程序,当用户单击“录制”时,它需要开始将视频捕获到文件中。 为此,我创建了一个 Capture Graph,PREVIEW 引脚连接到 RE
我构建了一个人脸检测应用程序,我从 onPreviewFrame 获取帧,进行人脸检测,然后在 surfaceView 上方的 Canvas 上绘制一个圆圈。问题是当 Camera.StartPrev
要遵循哪些准则才能在 CKAN 数据预览工具上很好地预览数据?我正在 CKAN 工作,一直在上传数据或将其链接到外部网站。有些可以很好地预览,有些则不能。我一直在网上研究机器可读性,但找不到任何与 C
我看到其他人在 Xcode 11 和 12 中使用 SwiftUI Previews 发布了问题,但在其他地方没有看到这个问题。 在 Xcode 11 中运行的旧项目在 Xcode 12 中加载,无论
从上一个 Android Studio 2.0 预览升级到 Preview 5 后,我在从 android.support.wearable 导入时遇到了问题> 包。 主应用和 Wear 应用的构建和
我正在使用 Visual Studio 2013 预览版,并且我正在尝试在我的应用程序中使用更少的文件。但是我在右 Pane 中收到编译错误。你可以看看它。有人可以帮我吗? 最佳答案 您必须使用“Un
我已经找到并阅读了这个 tutorial .确实很好!我故意使用“阅读”这个词。早知道就不来这里问了。 现在:我试图将我读过的内容插入到我的应用程序中。我需要带有静态图像和相机预览控件的不同叠加层。我
我正在分别在Jenkins-X的“预览”和“jx-staging”中使用“jx预览”和“jx升级”命令部署服务。 我想删除与使用jx命令部署的特定微服务关联的资源(如部署,服务,pv和pvc等)。 因
我正在 Visual Studio 11 Developer Preview 中编写应用程序,在应用程序与 reader 一起运行一段时间后出现此错误。InputStreamOptions = Inp
今天我对我的 AOSP 存储库执行了一个repo sync,然后我收到了一些错误。这些是我从终端收到的: From https://android.googlesource.com/platform/
我正在使用 IntelliJ IDEA 2021.2.3 和 JDK 17。我有 Java 17 中的代码片段 pom.xm 4.0.0 org.example funct
我正在使用 IntelliJ IDEA 2021.2.3 和 JDK 17。我有 Java 17 中的代码片段 pom.xm 4.0.0 org.example funct
我在网页上有一个dropzone.js实例,具有以下选项: autoProcessQueue:false uploadMultiple:true parallelUploads:20 maxFiles
有关PowerShell Copy-Item命令的快速问题。我想知道您是否具有目录结构,并且想要覆盖另一个目录结构,是否有一种方法可以在“预览”模式下运行Copy-Item命令。它会将覆盖的文件从目录
我正在尝试实现一个 REST 服务(或者甚至是单个 Servlet),它允许我快速“预览”传入文件(包含单个文件的多部分请求)。 这个想法是在数据库中解析并存储进入服务的潜在巨大文件的前几行。 我面临
如何创建这样的圆形/椭圆形或圆角相机预览(中间的圆应该是相机预览)? 伦敦图像代表带有按钮和 View 的其余 UI,因此它必须是可见的,这就是为什么我不能使用像添加 android:backgrou
我有一个 WPF 文本框,并执行以下操作 输入文本“12345” 在 3 和 4 之间移动光标(使用箭头或鼠标点击) 输入 0(因此文本现在为“123045”) 哪个事件/事件参数可以告诉我在位置 4
我是一名优秀的程序员,十分优秀!