Web api返回异步方法的值

时间:2017-12-01 08:33:04

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

我对HttpResponseMessageTask<HttpResponseMessage>感到困惑。

如果我使用HttpClient方法PostAsync()发布数据,我需要将Task<HttpResponseMessage>而不是HttpResponseMessage作为返回值给予Web服务方法我明白了。

如果我使用Request.CreateResponse(HttpStatusCode.Forbidden, myError.ToString()); 然后我只获取了响应消息对象,但没有获得Task对象。

所以我的问题是如何为web api方法的异步调用创建Fitting返回? (因此我的理解是正确的,如果是这样,如何最好地将消息对象转换为Task<HttpResponseMessage>对象)

原始代码:

public HttpResponseMessage DeviceLogin(MyDevice device)
{
    EnummyError myError = EnummyError.None;

    // Authenticate Device.
    myError = this.Authenticate(device);

    if (myError != EnummyError.None)
    {
        return Request.CreateResponse(HttpStatusCode.Forbidden, myError.ToString());
    }
}

更新的方法标题:

public Task<HttpResponseMessage> DeviceLogin(MyDevice device)

1 个答案:

答案 0 :(得分:3)

Web Api 2具有这些抽象类,现在建议使用它们。您仍然可以使用HttpResponseMessage(在我看来,初学者更容易理解),但Web Api 2建议使用IHttpActionResult

至于返回类型,只是做了你以前做过的事情。 Task<T>以这种方式自动

您还可以查看this.Authenticate()是否有async变体。

public async Task<IHttpActionResult> DeviceLogin(MyDevice device)
{
    EnummyError myError = EnummyError.None;

    // Authenticate Device.
    myError = this.Authenticate(device);

    // Perhaps Authenticate has an async method like this.
    // myError = await this.AuthenticateAsync(device);


    if (myError != EnummyError.None)
    {
        return ResponseMessage(Request.CreateResponse(Request.CreateResponse(HttpStatusCode.Forbidden, myError.ToString()));
    }
}

ResponseMessage()方法在水下创建ResponseMessageResult。此类派生自IHttpActionResult,并在构造函数中接受HttpResponseMessage作为参数(由Request.CreateResponse()生成)。