简单的 Http 请求在 Visual Studio 中执行时挂起,在 powershell 中工作 [关闭]

Posted

技术标签:

【中文标题】简单的 Http 请求在 Visual Studio 中执行时挂起,在 powershell 中工作 [关闭]【英文标题】:simple Http request hangs while executed in Visual Studio, works in powershell [closed] 【发布时间】:2017-08-11 09:48:59 【问题描述】:

我正在尝试使用 HttpClient 使用 C# 执行 http 请求。但是,每次我调用 GetAsync 时,代码都会挂起。 powershell 中的类似故事。

这是我的工作 java 示例:

Authenticator.setDefault( new Authenticator()

    @Override
    protected PasswordAuthentication getPasswordAuthentication()
    
        return new PasswordAuthentication( "userName", "pwd".toCharArray());
    
);
URL url = new URL( "http://serverName.com/ur?fields=cams_id;email");
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setRequestMethod( "GET");
conn.setRequestProperty( "Accept", "application/json");

if( conn.getResponseCode() != 200)  throw new RuntimeException( "Failed : HTTP error code : " + conn.getResponseCode()); 

BufferedReader br = new BufferedReader( new InputStreamReader( (conn.getInputStream())));

String output;
System.out.println( "Output from Server .... \n");
while( (output = br.readLine()) != null)

    System.out.println( output);


conn.disconnect();

我尝试在 C# 中这样写:

    public async Task<HttpResponseMessage> DoTheTest()
    
        using (var handler = new HttpClientHandler  Credentials = new System.Net.NetworkCredential("userName", "pwd") )
        
            HttpClient cons = new HttpClient(handler);
            cons.BaseAddress = new Uri("http://serverName.com/");
            cons.DefaultRequestHeaders.Accept.Clear();
            cons.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

            using (cons)
            
//always hangs here.
                var response = await cons.GetAsync("ur?fields=cams_id;email");
                if (response.IsSuccessStatusCode)
                
                    return response;
                
            
        
        return null;
    

但是,它不起作用。你能帮我“翻译”吗?

顺便说一句,此代码在 powershell 中适用于我。到目前为止,在 C# 中没有任何工作:

$user = 'userName'
$pass = 'pwd'

$pair = "$($user):$($pass)"

$encodedCreds =   [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes($pair))

$basicAuthValue = "Basic $encodedCreds"

$Headers = @
    Authorization = $basicAuthValue



Invoke-RestMethod -Uri 'http://serverName.com/ur?fields=cams_id;email'-Headers $headers

这又在 Visual Studio C# 中不起作用:

        WebRequest httpWebRequest = HttpWebRequest.Create("http://serverName.com/ur?fields=cams_id;email");
        ((HttpWebRequest)httpWebRequest).ProtocolVersion = HttpVersion.Version10;
        String username = "userName";
        String password = "pwd";
        String encoded = System.Convert.ToBase64String(System.Text.Encoding.GetEncoding("ISO-8859-1").GetBytes(username + ":" + password));
        httpWebRequest.Headers.Add("Authorization", "Basic " + encoded);
        //hangs here, too
        using (var response = httpWebRequest.GetResponse())
        using (var reader = new StreamReader(response.GetResponseStream()))
        
            var result = reader.ReadToEnd();
            Assert.IsTrue(!String.IsNullOrEmpty(result));
        

【问题讨论】:

你应该避免调用异步方法的.Result。请改用async / await 这会造成问题吗?结果不到一秒,我只想让它工作。 我怀疑它默认为 http1.1。你不需要像这样将客户端设置为 http1.0: HttpWebRequest request = (HttpWebRequest)WebRequest.Create("URL"); request.ProtocolVersion = HttpVersion.Version10; 投反对票的原因之一可能是您使用了描述为DO NOT USE - Use [apache-commons-httpclient], [apache-httpclient-4.x] or [dotnet-httpclient]的标签 这里不是反对者,但However, it doesn't work. 没有任何意义。有什么例外吗?或者它只是挂起?还是别的什么? 【参考方案1】:

您对.Result 的调用可能会导致死锁。您应该重构方法以使用 async/await。

public async Task BasicTest()

然后,您需要将GetAsync 调用更新为:

HttpResponseMessage response = await cons.GetAsync("ur?fields=cams_id;email");

编辑:看起来请求超时。我相信默认超时是 100 秒。

尝试更改超时以查看是否导致挂起:

cons.Timeout = TimeSpan.FromSeconds(5);

【讨论】:

【参考方案2】:

问题不在于代码,而在于机器。杀死 Sophos SSL *** Client 后,代码运行没有问题。仍然不确定为什么 powershell 有效而 c#(在 VS 或外部)没有。

【讨论】:

以上是关于简单的 Http 请求在 Visual Studio 中执行时挂起,在 powershell 中工作 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

visual studio 2010问题修复

如何在 Visual C# 中发送 HTTP 2.0 请求

visual-studio-code 中的自动右括号不适用于 js 和 jsx 文件

请求的资源不支持 Visual Studio 2010 中的 HTTP 方法“GET”

缺少使用 viola opencv core2410d.dll 的 Opencv 人脸检测

Visual Basic https 获取请求 - 接受 SSL