C# WebClient调用REST服务在控制台应用程序中工作,但在asp.net中不工作
我正在调用一个测试REST web服务,它基本上以字符串作为输入,并将其回显给调用者。在C#控制台应用程序中,我有以下代码:C# WebClient调用REST服务在控制台应用程序中工作,但在asp.net中不工作,c#,asp.net,rest,C#,Asp.net,Rest,我正在调用一个测试REST web服务,它基本上以字符串作为输入,并将其回显给调用者。在C#控制台应用程序中,我有以下代码: static async Task RunAsync() { using (var client = new HttpClient()) { string baseAddress = "http://xxx.xxx.xxx.xxx/Services/OnyxCloudSyncService.svc/pingSync"; clien
static async Task RunAsync()
{
using (var client = new HttpClient())
{
string baseAddress =
"http://xxx.xxx.xxx.xxx/Services/OnyxCloudSyncService.svc/pingSync";
client.BaseAddress = new Uri(baseAddress);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new
MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await
client.GetAsync("?sampleJson={SAMPLEJSON}");
if (response.IsSuccessStatusCode)
{
string txtBlock = await response.Content.ReadAsStringAsync();
Console.WriteLine(txtBlock);
Console.ReadKey();
}
}
}
这段代码运行得很好。但是,当我将相同的代码复制到ASP.NET页面的代码隐藏中时,我会在调用服务时超时:
using (var SyncClient = new HttpClient())
{
string baseAddress = "http://xxx.xxx.xxx.xxx/Services/OnyxCloudSyncService.svc/pingSync";
SyncClient.DefaultRequestHeaders.Accept.Clear();
SyncClient.DefaultRequestHeaders.Accept.Add(new
MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await
SyncClient.GetAsync("?sampleJson={SAMPLEJSON}");
if (response.IsSuccessStatusCode)
{
string txtBlock = await response.Content.ReadAsStringAsync();
Response.Write(txtBlock);
Response.End();
}
else
{
Response.Write("Error Calling service");
Response.End();
}
}
我从这个页面得到的错误是:
System.Net.Sockets.SocketException: A connection attempt failed because
the connected party did not properly respond after a period of time, or
established connection failed because connected host has failed to respond
xxx.xxx.xxx.xxx:80.
是否需要在WebClient上设置某种类型的设置或选项,以使其在ASP页面中像在Console应用程序中一样工作?我不明白为什么这在控制台应用程序中有效,而在ASP.NET网页中无效。您可能会遇到问题,因为没有等待结果,解决方案可能在以下位置找到: 我假设您使用的是.NET4.5。 将方法编辑为实例,而不是静态的,因为您将无法访问
响应
对象:
async Task RunAsync()
{
using (var client = new HttpClient())
{
string baseAddress =
"http://74.120.219.166/Services/OnyxCloudSyncService.svc/pingSync";
client.BaseAddress = new Uri(baseAddress);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new
MediaTypeWithQualityHeaderValue("application/json"));
HttpResponseMessage response = await
client.GetAsync("?sampleJson={SAMPLEJSON}");
if (response.IsSuccessStatusCode)
{
string txtBlock = await response.Content.ReadAsStringAsync();
Response.Write(txtBlock);
Response.End();
}
else
{
Response.Write("Error Calling service");
Response.End();
}
}
}
运行如下方法:RegisterAsyncTask(newpageasynctask(RunAsync))代码>
将Async=“true”
放入.aspx页面的Page
指令中。
我尝试了这种方法,效果如预期。您是否在同一台机器上运行console应用程序和ASP.NET应用程序?是否可以尝试通过javascript点击此代码?@mason。是的,是同一台机器。@xxmrlnxx我现在将尝试通过JS来完成这项工作,编写代码需要一点时间,但我会尝试,看看它是否可以通过浏览器工作。@xxmrlnxx我弄糟了一些难看的JS,它工作了。如果我将地址粘贴到Firefox的地址栏中,它甚至可以工作。仍然不知道为什么webclient不能在后端C#上连接。这看起来很有希望,因为我没有在ASP页面上做任何这些。你说的我都做了,但还是收到了同样的错误信息。该死!感谢您在ASP.NET中提供有关异步的要点。感谢。请尝试使用Fiddler查看请求是否已发送以及响应是否已到达。您还可以捕获来自控制台应用程序的请求,并将其与从ASP.NET页面生成和发送的请求进行比较。还要检查防火墙是否可能导致了这一问题。做了,这就是答案。垂下我的头。这是我没有作为HttpHandler包含的公司代理。控制台不使用浏览器,但WebClient使用,因此不匹配。现在工作得很好!感谢大家的建议,感谢Ivan G的重要建议,以及解决额头撞击问题的策略。谢谢太好了,我很高兴这有帮助