【发布时间】:2017-07-11 21:34:33
【问题描述】:
我正在尝试编写一个 webapi,它尝试使用 async 和 await 发布一个 webapi 调用,我当前的问题是,一旦我调用 await client.PostAsync(url, content);,它就会挂起。
1.如何调试为什么会挂起?
2.有没有办法不用 async 和 await 来做?我想按顺序做
public static async Task<string> testWCF2(string xmlConfig)
{
string submitOut;
using (var client = new System.Net.Http.HttpClient())
{
var url = "http://server:8100/api/SoftwareProductBuild";
var content = new StringContent(xmlConfig, Encoding.UTF8, "application/xml");
var response = await client.PostAsync(url, content);
if (response.IsSuccessStatusCode)
{
var responseBody = await response.Content.ReadAsStringAsync();
submitOut = responseBody;
}
else
{
submitOut = string.Format("Bad Response {0} \n", response.StatusCode.ToString());
submitOut = submitOut + response;
}
}
return submitOut;
}
public async Task<string> QlasrSubmit(List<XMLSiInfo> xmlConfigs)
{
string submitOut = "QLASR: ";
foreach (XMLSiInfo xmlConfig in xmlConfigs)
{
submitOut = submitOut + "\n" + await testWCF2(xmlConfig.xml);
}
return submitOut;
}
public async Task<string> QlasrPostcommit(string si, string sp, string variant = null)
{
.....
string submitStatus = await QlasrSubmit(siInfo);
.....
return submitStatus;
}
服务:
public async Task<string> QlasrPostcommit(string si, string sp, string variant = null)
{
return await DPR.QlasrPostcommit(si, sp, variant);
}
控制器:
[Route("api/DevPool/QlasrPostcommit")]
[HttpPost]
public ResponseObject QlasrPostcommit(string si, string sp, string variant = null)
{
ResponseObject response = new ResponseObject();
try
{
response.status = 200;
response.data = DPS.QlasrPostcommit(si, sp, variant);
return response;
}
catch (Exception e)
{
response.status = 200;
response.data = null;
response.message = e.Message;
return response;
}
}
【问题讨论】:
-
您是否尝试过使用其他工具调用它,例如我认为 Postman 是最好的调试方式
-
@BRAHIMKamel - 有没有一种简单的方法可以在 C# 中发布 webapi 调用,这对于发布 webapi 来说太复杂了,在 python 中要简单得多..
-
在c#中很简单,但你应该确保你可以毫无问题地调用你的api
-
@JeffShort 检查以确保您没有混合 async/await 和阻塞调用,如
.Result或.Wait调用堆栈更高,这可能导致死锁。接下来,根据显示的服务方法,您还需要使控制器动作异步 -
@Nkosi 很好地抓住了控制器的动作。 @JeffShort,确保您将该控制器操作标记为:
public async Task<ResponseObject> QlasrPostcommit(string si, string sp, string variant = null),然后 await 您的呼叫:response.data = await DPS.QlasrPostcommit(si, sp, variant);
标签: c# asp.net-web-api async-await