【问题标题】:POST call not returning a result from REST API calling async functionPOST 调用未从 REST API 调用异步函数返回结果
【发布时间】:2017-04-07 00:35:07
【问题描述】:

我们需要捕获在我们的第三方网络应用程序之一中发生的任何客户端错误。 为此,我在我们的一个 API 控制器中编写了一个 API Post 调用。 我在我的 API 中使用了以下代码: (EnableCors 是作为 system.web.cors 的 nuget 包的一部分,它为 API 调用启用 cors):

[EnableCors(origins: "/the client address that will call this API method", headers: "*", methods: "OPTIONS, POST, GET, PUT")]

[System.Web.Http.HttpPost]
public HttpResponseMessage RecordLogMessage(EventLogSaveCommand eventLog)
{                  
    var result = await _mediator.SendAsync(eventLog);

    return Request.CreateResponse(HttpStatusCode.OK, result);
}

这是一个 POST 方法,我将命令请求发送到调解器的异步消息处理程序,chrome 开发工具中的客户端调用返回“显示临时标头”,我怀疑它可能是我在 Chrome 上安装的插件浏览器,所以我也在 Firefox 和 IE 中尝试过,它们都为 POST 调用返回“挂起”状态,似乎它正在等待主机服务器的返回状态代码。 虽然事件日志已插入数据库并且操作实际上已完成,但它无法向客户端返回 OK(或创建的代码,我都尝试过)状态代码。 在互联网上搜索后,我注意到 RESTFull API POST 不会以与同步调用相同的方式处理异步调用,因此我不得不将响应代码替换为“SeeOthers”:

return Request.CreateResponse(HttpStatusCode.SeeOther, result);

但这并没有帮助,因为它甚至导致中介没有将数据保存到数据库中。

我尝试的第二种方式,我将调解器处理程序更改为同步调用,因此我使用了 mediator.Send(eventLog) 并返回响应状态代码为:

return Request.CreateResponse(HttpStatusCode.OK, result);

这很好,客户端得到了 OK 状态码作为响应。 但是我想知道如何使用调解器的异步调用以及结果代码有什么问题,为什么即使它已成功完成命令也无法返回结果。

这也是我从客户端调用它的方式:

var jsonData = JSON.stringify({message:"Test message", Uri:"Test url", source: "Test Source" , columnNo: "Test columnNo", error: "Test Error", lineNo: "Test Line No"});

$.ajax({
    type: "POST",
    url: 'https://Myhost.com/api/CustomEventLog/RecordLogMessage/',
    data: jsonData,
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    processData: false,
    success: function(response){
    console.log("Error recorded in log table with id: "+ response);
    // alert(response);     
    }
});

【问题讨论】:

    标签: c# rest api asynchronous


    【解决方案1】:

    好的,对于任何可能感兴趣的人,我将 POST 调用更改为异步调用,如下所示:

    [EnableCors(origins: "*", headers: "*", methods: "OPTIONS, POST, GET, PUT")]        
    [System.Web.Http.HttpPost]    
    public async Task<HttpResponseMessage> RecordLogMessage(EventLogSaveCommand eventLog)
    {
            //var result = _mediator.Send(eventLog);
    
            //return Request.CreateResponse(HttpStatusCode.OK, result);
    
            var result = await _mediator.SendAsync(eventLog);
    
            return Request.CreateResponse(HttpStatusCode.SeeOther, result);
    }
    

    这工作正常,客户端调用得到了结果,并且新日志也被创建了。

    谢谢

    【讨论】:

    • 这不是一种解决方法,但它是在 WebAPI 中执行异步的正确方法。
    猜你喜欢
    • 2022-12-22
    • 2020-03-15
    • 2019-09-30
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 1970-01-01
    相关资源
    最近更新 更多