Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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# WebClient调用REST服务在控制台应用程序中工作,但在asp.net中不工作_C#_Asp.net_Rest - Fatal编程技术网

C# WebClient调用REST服务在控制台应用程序中工作,但在asp.net中不工作

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

我正在调用一个测试REST web服务,它基本上以字符串作为输入,并将其回显给调用者。在C#控制台应用程序中,我有以下代码:

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的重要建议,以及解决额头撞击问题的策略。谢谢太好了,我很高兴这有帮助