2016-11-23 69 views
0

我們需要捕獲第三方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);  
    } 
}); 

回答

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); 
} 

這工作正常,客戶端調用有結果,並創建了新的日誌。

謝謝

+0

這不是一種解決方法,但它是在WebAPI中執行異步的正確方法。 – garethb

+0

Thanks @garethb,我剛剛更新了我的帖子。 – InkHeart