繁体   English   中英

HttpResponseMessage不返回任何响应?

[英]HttpResponseMessage Not Returning any response?

我正在尝试连接到API并从中获取数据。 但是我在HttpResponseMessage代码行之后没有得到任何信息.if(response.IsSuccessStatusCode)从未运行。 我已经尝试了一切,但还没有尝试。 请帮忙。 这是我的代码。

using System;
using Newtonsoft;
using System.Net.Http.Headers; 
using System.Text; 
using System.Net.Http; 
using System.Web; 
using System.Collections.Generic;
using Newtonsoft.Json;
using System.Xml;
using System.Web.Mvc;
using System.Threading.Tasks;


namespace JKLLAppMobile.API
{
public class JKLLAPI : Controller
{
    public async Task<List<JasonData>> MakeRequest()
    {
        List<JasonData> HanaData = new List<JasonData>();

        var client = new HttpClient();
        var queryString = HttpUtility.ParseQueryString(string.Empty);
        queryString["format"] = "json";
        queryString["filter"] = "BDATU eq '20170421' and BWLVS eq '609'";
        var uri = "https://jkhapimdev.azure-api.net/api/beta/v2/bound/?" + queryString;

        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, uri);
        request.Headers.Authorization = new AuthenticationHeaderValue("Ocp-Apim-Subscription-Key", "{Token-Key}");
        HttpResponseMessage response = await client.SendAsync(request);

        if (response.IsSuccessStatusCode)
        {
            var responseString = await response.Content.ReadAsStringAsync();
            string json_data = JsonConvert.SerializeObject(responseString); 


        }

        return HanaData;
    }
}

}

调用Ajax方法函数TotalTestMonthly(){

    $.ajax({
        url: '../JKLLAPI/MakeRequest',
        type: 'POST',
        dataType: 'json',
        cache: false,
        async: false,
        data: {},
        success: function (data) { 
            if (data.Success == true) {

            } 
        }
    }); 
}

既然您说过它“从不”运行IsSuccessStatusCode行,即使超时后也不会运行,我想您可能会遇到僵局。

正如我在上面评论的那样,Stephen Cleary有一篇非常好的文章描述了这个问题。 他还撰写了MSDN文章

总结一下(如果链接的文章消失了):

  • 当您进行异步调用时,当前的SynchronizationContext(如果为null,则为TaskScheduler)将被捕获为异步调用的一种返回点。
  • GUI和ASP.NET应用程序使用SynchronizationContext。 这仅允许一次运行同步代码块。
  • 异步任务完成后,它将尝试返回到SynchronizationContext,如果您从非异步位置开始,它将在someTask.Wait();上被阻止someTask.Wait();
  • 一旦达到这一点,您就会遇到一种情况,您的同步代码正在等待您的异步代码,而您的异步代码正在等待返回到您的同步代码,从而导致死锁。

注意:根据Stephen的MSDN文章,控制台应用程序没有此问题,因为它们使用TaskScheduler。 VS的单元测试任务运行程序确实存在此问题,这是我从中学到的。


所以,你可以做什么?

如果从GUI上下文运行异步,例如按钮单击,则应将按钮单击处理程序更改为异步方法:

// you can't change void to Task because of the type the delegate expects,
// but this is the correct way to do this.
public async void OnClicked(...)

然后,您可以使用标准的await,然后按预期方式处理上下文。

在您的异步方法中,您可以调用ConfigureAwait:

await Task.Delay(1000).ConfigureAwait(continueOnCapturedContext: false);
// or, simply:
await Task.Delay(1000).ConfigureAwait(false);

这将导致该方法在线程池上下文中执行其余的异步方法,从而避免了死锁。

如果由于某种原因您无法处理或包装async方法,则也可以使用Task.Run

// You can also use Task<string>.Run(...), for example
var task = Task.Run(async () => await someAsyncMethod());
task.Wait();

使用Task.Run将在线程池上下文中执行async方法,从而避免死锁。

我的解释确实没有使主题公正,因此,我强烈建议您阅读上面链接的文章。 我只是想确保我的答案包含一些有价值的内容,如果这些链接要消失的话:-)

注意进行异步的正确方法是一直向下同步(即从按钮单击到最深的异步调用)。 Task.Run不应异步方法中使用。


我整理了自己的快速示例来演示这些技术:

// Deadlocks
public void button2_Click(object sender, EventArgs e)
{
    var task = GetNews();
    task.Wait();
    MessageBox.Show(task.Result);
}

// Doesn't deadlock
public async void button3_Click(object sender, EventArgs e)
{
    var result = await GetNews();
    MessageBox.Show(result);
}

// Doesn't deadlock
public void button4_Click(object sender, EventArgs e)
{
    var task = GetNews(false);
    task.Wait();
    MessageBox.Show(task.Result);
}

// Doesn't deadlock
public void button5_Click(object sender, EventArgs e)
{
    var task = Task<string>.Run(async () => await GetNews());
    task.Wait();
    MessageBox.Show(task.Result);
}

// The boolean option is just so that I don't have to write two example methods :)
// You obviously don't have to pass this as a parameter, and can just directly call ConfigureAwait
public async Task<string> GetNews(bool continueOnCapturedContext = true)
{
    await Task.Delay(100).ConfigureAwait(continueOnCapturedContext: continueOnCapturedContext);
    return "hello";
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM