C# 如何使用async和Wait发布webapi调用
我正在尝试编写一个webapi,它试图使用async和await发布一个webapi调用,我当前的问题是只要我调用C# 如何使用async和Wait发布webapi调用,c#,asp.net-web-api,async-await,C#,Asp.net Web Api,Async Await,我正在尝试编写一个webapi,它试图使用async和await发布一个webapi调用,我当前的问题是只要我调用await client.PostAsync(url,内容)它挂起 1.如何调试为什么挂起 2.有没有一种方法可以不使用async和Wait来完成它?我想按顺序完成 public static async Task<string> testWCF2(string xmlConfig) { string submitOut;
await client.PostAsync(url,内容)代码>它挂起
1.如何调试为什么挂起
2.有没有一种方法可以不使用async和Wait来完成它?我想按顺序完成
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;
}
正如我在中提到的,您应该使用:
[路由(“api/DevPool/QlasrPostcommit”)]
[HttpPost]
公共异步任务QlasrPostcommit(字符串si、字符串sp、字符串变量=null)
{
ResponseObject response=新的ResponseObject();
尝试
{
响应状态=200;
response.data=等待DPS.QlasrPostcommit(si、sp、变量);
返回响应;
}
捕获(例外e)
{
响应状态=200;
response.data=null;
response.message=e.message;
返回响应;
}
}
在这个特殊的例子中,您遇到了一个问题。我解决了它,它工作得非常完美,没有deallock和等待结果
您已修复该服务:
public string QlasrPostcommit(string si, string sp, string variant = null)
{
Task<string > task = Task.Run<string >(async () => await
DPR.QlasrPostcommit(si, sp, variant));
task.Result;
}
公共字符串QlasrPostcommit(字符串si、字符串sp、字符串variant=null)
{
Task=Task.Run(异步()=>wait
QlasrPostcommit(si,sp,variant));
任务、结果;
}
一般答案:
公共类型返回MyAsyncMethod(myParams…)
{
Task=Task.Run(异步()=>wait
MyAsyncMethod(myParams…);
任务、结果;
}
您是否尝试过使用其他工具调用它,例如Postman是调试I的最佳方法think@BRAHIMKamel-是否有一种简单的方法可以在C#中发布webapi调用,这对于发布webapi来说太复杂了,在python中要简单得多..在c中#对来说很简单,但您应该确保可以在不使用issue@JeffShort检查以确保您没有混合使用async/Wait和阻塞调用,如.Result
或.Wait
调用堆栈的更高位置,这可能会导致死锁。接下来,根据所示的服务方法,您还需要使控制器操作异步,如下所示well@Nkosi很好地捕捉到了控制器的动作@JeffShort,确保将控制器操作标记为:public async Task QlasrPostcommit(string si,string sp,string variant=null)
,然后等待调用:response.data=wait DPS.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;
}
}
[Route("api/DevPool/QlasrPostcommit")]
[HttpPost]
public async Task<ResponseObject> QlasrPostcommit(string si, string sp, string variant = null)
{
ResponseObject response = new ResponseObject();
try
{
response.status = 200;
response.data = await DPS.QlasrPostcommit(si, sp, variant);
return response;
}
catch (Exception e)
{
response.status = 200;
response.data = null;
response.message = e.Message;
return response;
}
}
public string QlasrPostcommit(string si, string sp, string variant = null)
{
Task<string > task = Task.Run<string >(async () => await
DPR.QlasrPostcommit(si, sp, variant));
task.Result;
}
public TypeToReturn MyAsyncMethod(myParams...)
{
Task<TypeToReturn> task = Task.Run<TypeToReturn>(async () => await
MyAsyncMethod(myParams...));
task.Result;
}