【问题标题】:How to post a webapi call using async and await如何使用 async 和 await 发布 Web api 调用
【发布时间】: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&lt;ResponseObject&gt; QlasrPostcommit(string si, string sp, string variant = null),然后 await 您的呼叫:response.data = await DPS.QlasrPostcommit(si, sp, variant);

标签: c# asp.net-web-api async-await


【解决方案1】:

你应该使用async all the way,正如我在your previous question中提到的:

[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;
  }
}

在这种特殊情况下,您遇到了deadlock because you're blocking on asynchronous code

【讨论】:

    【解决方案2】:

    我解决了它,它工作得很好,没有解除锁定和等待结果!!

    您已修复服务:

    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;    
            }
    

    【讨论】:

      猜你喜欢
      • 2021-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-28
      • 1970-01-01
      • 2011-05-04
      相关资源
      最近更新 更多