Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C“HttpClient.SendAsync throw”;发送请求时出错";测试某些URL时出现异常_C#_.net_Http_Dotnet Httpclient - Fatal编程技术网

C# C“HttpClient.SendAsync throw”;发送请求时出错";测试某些URL时出现异常

C# C“HttpClient.SendAsync throw”;发送请求时出错";测试某些URL时出现异常,c#,.net,http,dotnet-httpclient,C#,.net,Http,Dotnet Httpclient,我正在开发一个C#控制台应用程序,用于测试URL是否有效或有效。它适用于大多数URL,可以从目标网站获得HTTP状态代码的响应。但是在测试其他一些URL时,应用程序在运行HttpClient.SendAsync方法时抛出“发送请求时出错”异常。因此,我无法得到任何响应或HTTP状态代码,即使这个URL在浏览器中实际工作。我非常想知道如何处理这个案子。如果URL不起作用或者服务器拒绝我的请求,它至少应该给我相应的HTTP状态码 以下是我的测试应用程序的简化代码: using System; usi

我正在开发一个C#控制台应用程序,用于测试URL是否有效或有效。它适用于大多数URL,可以从目标网站获得HTTP状态代码的响应。但是在测试其他一些URL时,应用程序在运行HttpClient.SendAsync方法时抛出“发送请求时出错”异常。因此,我无法得到任何响应或HTTP状态代码,即使这个URL在浏览器中实际工作。我非常想知道如何处理这个案子。如果URL不起作用或者服务器拒绝我的请求,它至少应该给我相应的HTTP状态码

以下是我的测试应用程序的简化代码:

using System;
using System.Net.Http;
using System.Threading.Tasks;

namespace TestUrl
{
    class Program
    {
        static void Main(string[] args)
        {
           // var urlTester = new UrlTester("http://www.sitename.com/wordpress"); // works well and get 404
           // var urlTester = new UrlTester("http://www.fc.edu/"); // Throw exception and the URL doesn't work
           var urlTester = new UrlTester("http://www.ntu.edu.tw/english/"); // Throw exception and the URL works actually

            Console.WriteLine("Test is started");

            Task.WhenAll(urlTester.RunTestAsync());

            Console.WriteLine("Test is stoped");
            Console.ReadKey();
        }


        public class UrlTester
        {
            private HttpClient _httpClient;
            private string _url;

            public UrlTester(string url)
            {
                _httpClient = new HttpClient();
                _url = url;
            }

            public async Task RunTestAsync()
            {
                var httpRequestMsg = new HttpRequestMessage(HttpMethod.Head, _url);

                try
                {
                    using (var response = await _httpClient.SendAsync(httpRequestMsg, HttpCompletionOption.ResponseHeadersRead))
                    {
                        Console.WriteLine("Response: {0}", response.StatusCode);
                    }
                }
                catch (Exception e) 
                { 
                }
            }
        }

    }
} 

如果查看
InnerException
,您将看到:

“无法解析远程名称:'www.fc.edu'”


此URL在我的浏览器上也不起作用

为了获得HTTP响应,您需要客户机能够与服务器通信(即使是为了获得),并且在您的情况下发生了错误

对于这种情况,某些浏览器具有自动完成功能,如果找不到特定URL,浏览器将使用不同的后缀/前缀重试,例如:

try "x"
if didn't work, try "www." + x
if this didn't work try "www." + x + ".com"
if this didn't work try "www." + x + ".net"
if this didn't work try "www." + x + "." + currentRegionSuffix.
但请注意,您可以从以下位置更改代码:

catch (Exception e)
{

}
致:

您将能够看到导致错误的原因

另外,除非投掷者抛出了一般的
异常,否则您永远不应该想捕捉到一般的
异常
,即使如此,也永远不要捕捉异常并对异常不做任何处理,至少要记录它

请注意,由于您只等待一项任务,因此可以使用:

urlTester.RunTestAsync().Wait();
而不是:

Task.WhenAll(urlTester.RunTestAsync());

任务。当给定的
任务
完成时,whalll
创建一个新的
任务
。在您的情况下,您需要
任务.WaitAll
任务.WhenAll(…).Wait()

通常,
任务.WhenAll
将返回需要等待的等待。如果他想要阻止版本,
Task.WaitAll
是他应该使用的。感谢@TamirVered和Yuval Itzhakov帮助我找出异常的细节并改进我的代码。现在的问题是,当DNS级别出现问题时,我如何知道此URL是否有效。因为在很多情况下,URL实际上是有效的。检查测试的URL部分,我刚刚添加了此案例。您可以再次阅读
内部异常
以查看错误原因,并查看
内部状态
以查看连接后的状态。“此URL在我的浏览器上也不起作用。”-此URL帮助了我,我错误地设置了内部DNS op;)
Task.WhenAll(urlTester.RunTestAsync());