如何以正确的方式从 WebAPI 响应

本文关键字:方式 WebAPI 响应 | 更新日期: 2023-09-27 17:56:00

我尝试编写 api 控制器,但遇到了一些问题:向 WebAPI 发布消息后没有响应。我尝试谷歌搜索,我找到了一些答案,但它对我不起作用。我不明白为什么.

http post request的代码(从这里开始,它只是简单mvc控制器的示例):

public ActionResult Test()
{
    RunAsync().Wait();
    return null;
}
static async Task RunAsync()
{
    using (var client = new HttpClient())
    {
        client.BaseAddress = new Uri("http://localhost:50984/");
        client.DefaultRequestHeaders.Accept.Clear();
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        // HTTP POST
        var gizmo = new ErrorModel
        {
            Key = "2ccab87f5f904d3688a28b1a1fb4269b",
            Name = "HTTP Error 404"
        };
        HttpResponseMessage response = await client.PostAsJsonAsync("exceptionregistration/handle", gizmo);
        if (response.IsSuccessStatusCode)
        {
        }
    }
}

WebApi 控制器:

public class HandleController : ApiController
{
    [System.Web.Http.HttpPost, ValidateInput(false)]
    public HttpResponseMessage Post([FromBody]ErrorModel errorData)
    {
        try
        {
            // some code
        }
        catch (Exception ex)
        {
            Logger.error(ex);
            return null;
        }
        return Request.CreateResponse(HttpStatusCode.OK, "value");
    }
}

而且这一行从未被完全执行(没有响应):

HttpResponseMessage response = await client.PostAsJsonAsync("exceptionregistration/handle", gizmo);

怎么了?为什么当我等待响应时没有结果?
也许这是将 json 消息发布到 Web api 控制器的更好方法?

如何以正确的方式从 WebAPI 响应

我认为您因为RunAsync().Wait();而陷入僵局.您的Test()方法正在阻止上下文线程,等待RunAsync()完成,RunAsync()正在等待上下文空闲以便它可以完成。斯蒂芬·克利利(Stephen Cleary)的这篇博客详细描述了这个问题:链接。

解决方案是更改签名以允许"等待"RunAsync()

public ActionResult Test()public async Task<ActionResult> Test()

RunAsync().Wait();await RunAsync();

您可以使用

fiddler来了解您的API是否有效。