我在Azure中运行的控制台应用程序(webjob)调用也在azure中运行的API。控制台应用程序从csv文件发布消息。 当我从本地(Windows 10)计算机运行控制台应用程序(api在azure中运行)时,它按预期工作(没有错误)。 当我在Azure中运行控制台应用程序(api在azure中运行)时,它会处理大约980条消息,然后开始报告错误
错误:
我认为由于某种原因,当控制台应用程序在Azure中运行时,它会耗尽端口,但我不知道如何解决这个问题。 我的文件有50,000行,但正如所述,只有在发布之前才达到约980行。 在另一端,api将收到的消息发布到sql数据库和azure事件中心。 PostAsJsonAsync完成后,如何强制应用程序释放端口? 如何检查端口是否已释放或如何检查端口是否可用? 如果您发现任何其他可能导致这些错误的原因,请提供帮助。
这是我的代码:
public async Task<string> PostMessageToAPI(string aMsg)
{
HttpResponseMessage response = null;
string strResponse = "";
try
{
using (var client = new HttpClient())
{
client.SetBearerToken("access token here");
client.BaseAddress = new Uri("MyBaseUrl.com");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
using (response = await client.PostAsJsonAsync("my/url/goes/here", anEvent.ToLower()))
{
if (response != null)
{
if (response.StatusCode != HttpStatusCode.OK)
{
throw new HttpRequestException(response.ReasonPhrase);
}
else
{
return await response.Content.ReadAsStringAsync();
}
}
}
}
}
catch (HttpRequestException ex)
{
// exception message states: "An error occurred while sending the request"
}
return strResponse;
}
答案 0 :(得分:-1)
请勿使用HttpClient
中包含的using
。使用静态实例并共享它。
public class MyClass()
{
private HttpClient client = null;
public MyClass(){
client = new HttpClient();
client.SetBearerToken("access token here");
client.BaseAddress = new Uri("MyBaseUrl.com");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
public async Task<string> PostMessageToAPI(string aMsg)
{
HttpResponseMessage response = null;
string strResponse = "";
try
{
using (var response = await client.PostAsync("my/url/goes/here", new StringContent(aMsg, Encoding.UTF8, "application/json")))
{
if (response != null)
{
if (response.StatusCode != HttpStatusCode.OK)
{
throw new HttpRequestException(response.ReasonPhrase);
}
else
{
return await response.Content.ReadAsStringAsync();
}
}
}
}
catch (HttpRequestException ex)
{
// exception message states: "An error occurred while sending the request"
}
return strResponse;
}
}
你甚至可以共享Class的同一个实例,重点是,每次重新创建和重新打开套接字都不是最佳的,它最终会导致Socket Exhaustion,具体取决于你的通话吞吐量。