[英]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文章 。
总结一下(如果链接的文章消失了):
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.