Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/86.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.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# 异步调用HttpClient以通过ajax获取HttpResponseMessage_C#_Jquery_.net_Dotnet Httpclient_Httpresponsemessage - Fatal编程技术网

C# 异步调用HttpClient以通过ajax获取HttpResponseMessage

C# 异步调用HttpClient以通过ajax获取HttpResponseMessage,c#,jquery,.net,dotnet-httpclient,httpresponsemessage,C#,Jquery,.net,Dotnet Httpclient,Httpresponsemessage,实际上,我正在尝试使用HTTPClient类通过URL获取数据。我是通过ajax呼叫。但是,当获取响应时,它会从调试模式返回到运行模式,而不会发生任何事情。没有检索到响应。代码如下: jQuery $.ajax({ type: "GET", contentType: "application/json; charset=utf-8", url: "../../Services/AService.asmx/GetCompanyInformation"

实际上,我正在尝试使用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);
        }

    }
公共静态字符串CompanyDetails;
[网络方法]
[脚本方法(UseHttpGet=true)]
公共字符串GetCompanyInformation(字符串id)
{
string authorizationKey=“Bearer 5cae498ef11f128363c1fbb2761bbab40ac0e2e5”;
stringurl=string.Empty;
url=GetCompanyDetailsFrapps(id);
RunAsync(url.Wait();
返回公司详细信息;
}
静态异步任务RunAsync(字符串Url)
{
string authorizationKey=“Bearer 5cae498ef11f128363c1fbb2761bbab40ac0e2e5”;
尝试
{
使用(var client=new HttpClient())
{
client.BaseAddress=新Uri(Url);
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Add(“Authorization”,authorizationKey);
HttpResponseMessage response=wait client.GetAsync(Url);
if(响应。IsSuccessStatusCode)
{
string content=wait response.content.ReadAsStringAsync();
//UrlMetricsResponse mozResonse=JsonConvert.DeserializeObject(内容);
动态dynObj=JsonConvert.DeserializeObject(内容);
CompanyDetails=JsonConvert.SerializeObject(dynObj);
}
}
}
捕获(例外情况除外)
{
Console.WriteLine(“错误:+ex.Message”);
}
}

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

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

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

最好的选择是将应用程序升级到支持异步控制器的更现代化的版本,例如ASP.NET Web API或ASP.NET Core。这样,您就不必阻止HTTP调用上的线程。但如果这不是一个选项,则需要将HttpClient换成一个实际支持同步/阻塞HTTP的库。看一眼或看一眼。如果您继续使用HttpClient,并且调用堆栈中的任何位置都有
.Result
.Wait()
调用,那么您不仅阻塞了,而且还阻塞了


我怎么强调都不过分:HttpClient不支持同步HTTP,因此如果无法切换到更现代的web框架,则必须切换到较旧的HTTP库。

很可能是对client.GetAsync(Url)的调用失败,并且没有进入if块,因此,CompanyDetails对象为空或null,并返回给客户端。如果您在If语句上设置了一个断点,您应该能够看到发生了什么?可能的重复请不要这样做。它可能在您的测试中起了作用,但一旦您开始添加并发用户,您最终会发现自己陷入死锁地狱。我应该使用什么。。我真的很困惑。WebRequest还是RestSharp。有关详细信息,请参阅我的答案。我尝试了WebRequest部分。但当url不正确时,实际上是抛出错误,而不是通知。在使用HttpClient时,它会请求ISStatusCodeSucceed。但是,对于WebRequest,它会使用状态代码。如果找到,它将传递else If,并抛出异常。我们怎样才能在WebRequest中克服这种情况?我不太明白。也许这会有帮助