我们需要捕获在我们的第三方网络应用中发生的任何客户端错误。 为此,我在其中一个API控制器中编写了一个API Post调用。 我在API中使用了以下代码: (EnableCors是nuget包的一部分,作为system.web.cors,它为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方法,我将命令请求发送到mediator的异步消息处理程序,chrome dev工具中的客户端调用返回"显示临时标题",I怀疑它可能是我在我的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);
}
});
答案 0 :(得分:0)
好的,对于任何可能感兴趣的人,我将我的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);
}
这很好用,客户端调用有结果,并且还创建了新日志。
由于