2016-11-23 1 views
0

Нам нужно зафиксировать любые ошибки на стороне клиента, происходящие в одном из наших сторонних веб-приложений. Для этого я написал вызов API Post в одном из наших контроллеров API. Я использовал следующий код в моем 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 dev возвращает «Предварительные заголовки показаны», я подозревал, что это могут быть аддоны, которые я установил в браузере Chrome, поэтому я попробовал его в Firefox и IE, они оба возвращают статус «Ожидание» для вызова POST, и кажется, что он ждет хост-сервера формы кода возврата. Хотя журнал событий был вставлен в базу данных, и действие действительно завершено, но он не может вернуть клиенту код состояния (или созданный код, я попробовал оба). После поиска в Интернете, я заметил, что 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

Ok, для тех, кто может быть заинтересован, я изменил 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); 
} 

Это работало нормально, и клиентский вызов имел результат, и был создан новый журнал.

Thanks

+0

Это не обходной путь, но это правильный способ сделать async в WebAPI. – garethb

+0

Спасибо @garethb, я только что обновил свой пост. – InkHeart

Смежные вопросы