C#GetResponse()如何超时动态创建的url



这是我的方法,我将url传递给它以检查它是否处于活动状态。该链接在wowza服务上被激活,因此需要一些时间;"活着";

GetResponse返回404错误,因为无法访问url。

如果url在指定时间后不活动,有没有办法获得超时而不是404错误?

public async Task<IActionResult> GetLinkIsAlive([FromQuery] string url, [FromQuery] int timeout)
{
HttpWebResponse webResponse;
try
{
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Timeout = timeout;
webRequest.Method = "GET";
webResponse = webRequest.GetResponse() as HttpWebResponse;
return Ok(webResponse.StatusCode);
}
catch (WebException ex)
{
return BadRequest(ex.Message);
}
}

您可以使用连接池
它使用IHttpClientFactory来帮助维护客户端的池和生存期

在您的启动类中:

services.AddHttpClient<NameofyourService, NameofyourService>()
.AddTransientHttpErrorPolicy(  
p => p.WaitAndRetryAsync(new[]
{
TimeSpan.FromSeconds(1),
TimeSpan.FromSeconds(5),
TimeSpan.FromSeconds(10)
}));

它需要Microsoft.Extensions.Http.Polly您需要为您的服务使用HttpClient。所有添加的配置都将自动应用。

我的解决方案是每隔1秒调用while循环中的链接,等待整个Task。

private async Task<bool> IsLiveStreamAlive(string streamUrl, int retriesCount = 30)
{
try
{
bool res = false;
HttpClient client = new HttpClient();
Uri uri = new Uri(streamUrl);
HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
var request = new HttpRequestMessage(HttpMethod.Get, uri);
while (retriesCount > 1)
{
await Task.Delay(1000);
retriesCount--;
HttpResponseMessage httpResponse = await client.GetAsync(uri);
res = httpResponse.StatusCode == HttpStatusCode.OK ? true : false;
if (res)
{
Log.Info(string.Format("Stream alive: {0}", streamUrl));
break;
}
}
return res;
}
catch (WebException ex)
{
Log.Error(ex);               
}
return false;
}

最新更新