C# 如何使用async和Wait发布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;

我正在尝试编写一个webapi,它试图使用async和await发布一个webapi调用,我当前的问题是只要我调用
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;    
        }