我們需要捕獲第三方Web應用程序中發生的任何客戶端錯誤。 爲此,我在其中一個API控制器中編寫了API Post調用。 我用下面的代碼在我的API: (EnableCors是的NuGet包的一部分system.web.cors使CORS的API調用):POST調用不會從REST API調用異步函數返回結果
[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(或已創建的代碼,我嘗試過)狀態代碼返回給客戶端。 互聯網上搜索後,我注意到,作爲同步調用,所以我不得不更換響應代碼爲「SeeOthers」問題的REST API POST不會把同樣的方式異步調用:
return Request.CreateResponse(HttpStatusCode.SeeOther, result);
但這並沒有幫助,因爲它甚至導致中介沒有將數據保存在數據庫中。
我想第二個辦法,我改變了調解處理程序作爲一個同步調用,所以我用mediator.Send(事件日誌),並返回響應狀態代碼爲:
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);
}
});
這不是一種解決方法,但它是在WebAPI中執行異步的正確方法。 – garethb
Thanks @garethb,我剛剛更新了我的帖子。 – InkHeart