Нам нужно зафиксировать любые ошибки на стороне клиента, происходящие в одном из наших сторонних веб-приложений. Для этого я написал вызов 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);
}
});
Это не обходной путь, но это правильный способ сделать async в WebAPI. – garethb
Спасибо @garethb, я только что обновил свой пост. – InkHeart