Я вызываю контроллер WebAPI из jQuery AJAX, чтобы запросить удаление элемента через API REST.
Контроллер WebAPI возвращает ответ 204 (без содержимого), который затем вызывает второй запрос (GET).В этом примере я ожидаю, что оба запроса получат ответ 204 (без содержимого).
При просмотре в Chrome оба ответа полностью распознаются.
Однако Firefox не может справиться с 204. Если он не содержит содержимого.
Для получения снимков экрана Chrome (вверху) и Firefox (ниже) одинаковые запросы были отправлены в WebAPI.контроллер из обоих браузеров.На приведенном ниже снимке экрана показано, что Firefox распознает только первый ответ 204.
Ответ на эти два запроса создается по-разному:
Первый ответ использует ...
return Request.CreateResponse(HttpStatusCode.NoContent);
... который возвращает экземпляр HttpResponseMessage
.
Второй ответ использует ...
return new NoContentResult();
... которую мы определили как реализацию IHttpActionResult
...
public class NoContentResult : IHttpActionResult
{
private readonly HttpRequestMessage _request;
public NoContentResult(HttpRequestMessage request)
{
_request = request;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
var response = _request.CreateResponse(HttpStatusCode.NoContent, new StringContent("{}"));
return Task.FromResult(response);
}
}
new StringContent("{}")
в строке 4-й от последней является попыткой предоставить некоторый контент в помощь Firefox.Я также пытался new StringContent("null")
с тем же результатом.
Кроме того, если этот второй ответ проверен в Firefox, обнаруживается следующее сообщение об ошибке:
SyntaxError: JSON.parse: неожиданное завершение данных в строке 1 столбца 1 данных JSON
Кажется, что Firefox пытается проанализировать этот проблемный 204, но он, очевидно, не пытается анализировать первый ответ 204.
Более того, тип запроса (DELETE vs. GET), похоже, не имеет значения: если я возвращаю 204 как IHttpActionResult
из первого вызова, тогда Firefox все равно не понравится.
Firefox также отображает первый ответ, содержащий 168 байтов, а второй - 0 байтов, хотя он с радостью отображает заголовки (ниже).Firefox явно чем-то расстроен.
Может кто-нибудь объяснить, почему у Firefox возникает проблема с ответом 204 при доставке в виде реализации IHttpActionResult
, ноне когда он доставляется как HttpResponseMessage
?
[ Причина, по которой первый запрос возвращает HttpResponseMessage
, а второй возвращает IHttpActionResult
, заключается в том, что первый метод был установлен длядолгое время, тогда как второй метод добавляется только сейчас.И поскольку IHttpActionResult
проще для тестирования, мы бы хотели использовать это. ]