简单的 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-code 中的自动右括号不适用于 js 和 jsx 文件
请求的资源不支持 Visual Studio 2010 中的 HTTP 方法“GET”