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 循环中的链接并等待整个任务。

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;
}