【问题标题】:Calling HttpClient asynchronously to get the HttpResponseMessage via ajax通过ajax异步调用HttpClient获取HttpResponseMessage
【发布时间】:2018-08-02 00:52:42
【问题描述】:

我实际上是在尝试使用 HTTPClient 类通过 URL 获取数据。我通过 ajax 调用。但是,当获取响应时,它会从调试模式返回运行模式,并且没有任何反应。未检索到任何响应。下面是代码:

jQuery

$.ajax({
        type: "GET",
        contentType: "application/json; charset=utf-8",
        url: "../../Services/AService.asmx/GetCompanyInformation",
        data: { id: JSON.stringify(id) },
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        async:true,
        success: function (res) {
            var options = JSON.parse(res.d);                   

        },
        error: function (errormsg) {
            $(".dropdown_SubDomainLoading").hide();
            toastr.options.timeOut = 7000;
            toastr.options.closeButton = true;
            toastr.error('Something Went Wrong');
        }
    });

WebMethod 调用

public static string CompanyDetails;

    [WebMethod]
    [ScriptMethod(UseHttpGet = true)]
    public string GetCompanyInformation(string id)
    {
        string authorizationKey = "Bearer 5cae498ef11f128363c1fbb2761bbab40ac0e2e5";
        string url = string.Empty;
        url = GetCompanyDetailsForApps(id);
        RunAsync(url).Wait();
        return CompanyDetails;
    }

 static async Task RunAsync(string Url)
    {
        string authorizationKey = "Bearer 5cae498ef11f128363c1fbb2761bbab40ac0e2e5";
        try
        {
            using (var client = new HttpClient())
            {
                client.BaseAddress = new Uri(Url);
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Add("Authorization", authorizationKey);
                HttpResponseMessage response = await client.GetAsync(Url);

                if (response.IsSuccessStatusCode)
                {
                    string content = await response.Content.ReadAsStringAsync();
                    //UrlMetricsResponse mozResonse = JsonConvert.DeserializeObject<UrlMetricsResponse>(content);
                    dynamic dynObj = JsonConvert.DeserializeObject(content);
                    CompanyDetails = JsonConvert.SerializeObject(dynObj);
                }

            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("ERROR :" + ex.Message);
        }

    }

只要调用 client.GetAsync() 函数,它就会返回运行模式并且不会获取任何内容。难道我做错了什么。如何通过 url 检索响应?

【问题讨论】:

  • 很可能对 client.GetAsync(Url) 的调用失败并且它没有进入 if 块,因此您的 CompanyDetails 对象为空或 null 并返回给客户端。如果你正好在 if 语句处设置断点,你应该可以看到发生了什么?

标签: c# jquery .net dotnet-httpclient httpresponsemessage


【解决方案1】:

根据[WebMethod] 判断,我猜您正在维护一个非常旧的 ASP.NET 应用程序。这里的问题是不兼容的库。旧的 ASP.NET 不支持 async/await 语义,HttpClient 不支持同步 HTTP 操作。

您最好的选择是将应用程序升级到支持异步控制器的更现代的东西,例如 ASP.NET Web API 或 ASP.NET Core。这样您就不必阻塞 HTTP 调用上的线程。但如果这不是一个选项,您需要将 HttpClient 换成一个真正支持同步/阻塞 HTTP 的库。看看WebRequest 或 RestSharp。如果你继续使用 HttpClient 并且在调用堆栈上有.Result.Wait() 调用anywhere,那么你不仅是在阻塞,而且你是inviting deadlocks

这一点我怎么强调都不为过:HttpClient 不支持同步 HTTP,所以如果不能切换到更现代的 Web 框架,则必须切换到旧的 HTTP 库。 p>

【讨论】:

  • 我尝试了 WebRequest 部分。但是当 url 不正确而不是通知时,它实际上是在抛出错误。在使用 HttpClient 时,它要求 IsStatusCodeSucceeded。但是,对于 WebRequest,它会使用 Statuscode。如果找到,它将通过 else if 将抛出异常。我们如何在 WebRequest 中克服这种情况?
  • 不确定我是否理解。也许这会有所帮助docs.microsoft.com/en-us/dotnet/framework/network-programming/…
【解决方案2】:

好吧,当我将 client.GetAsync() 更改为 client.GetAsync().Result 时,它起作用了。

【讨论】:

  • 请不要那样做。它可能在您的测试中有效,但是一旦您开始添加并发用户,您最终会发现自己陷入了死锁地狱。
  • 我应该使用什么......因为我真的很困惑。
  • WebRequest 或 RestSharp。详情见我的回答。
猜你喜欢
  • 1970-01-01
  • 2022-01-16
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
相关资源
最近更新 更多