Я установил веб-приложение ASP.NET, начиная с шаблона MVC 4 / Web API. Кажется, что все работает очень хорошо - никаких проблем, о которых я знаю. Я использовал Chrome и Firefox для просмотра сайта. Я тестировал с помощью Fiddler, и все отзывы, похоже, касаются денег.
Итак, я приступаю к написанию простого Test.aspx для использования этого нового веб-API. Соответствующие части сценария:
<script type="text/javascript">
$(function () {
$.ajax({
url: "http://mywebapidomain.com/api/user",
type: "GET",
contentType: "json",
success: function (data) {
$.each(data, function (index, item) {
....
});
}
);
},
failure: function (result) {
alert(result.d);
},
error: function (XMLHttpRequest, textStatus, errorThrown) {
alert("An error occurred, please try again. " + textStatus);
}
});
});
</script>
Это генерирует заголовок REQUEST:
OPTIONS http://host.mywebapidomain.com/api/user HTTP/1.1
Host: host.mywebapidomain.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Origin: http://mywebapidomain.com
Access-Control-Request-Method: GET
Access-Control-Request-Headers: content-type
Connection: keep-alive
Как есть, веб-API возвращает метод 405 «Недопустимый».
HTTP/1.1 405 Method Not Allowed
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/xml; charset=utf-8
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 30 Sep 2013 13:28:12 GMT
Content-Length: 96
<Error><Message>The requested resource does not support http method 'OPTIONS'.</Message></Error>
Я понимаю, что команда OPTIONS по умолчанию не подключена к контроллерам веб-API ... Итак, я поместил следующий код в свой UserController.cs:
// OPTIONS http-verb handler
public HttpResponseMessage OptionsUser()
{
var response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
return response;
}
... и это устранило ошибку 405 Method Not Allowed, но ответ полностью пуст - данные не возвращаются:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Mon, 30 Sep 2013 12:56:21 GMT
Content-Length: 0
Должна быть дополнительная логика ... Я не знаю, как правильно кодировать метод Options, или контроллер - это даже подходящее место для размещения кода. Странно (для меня), что сайт веб-API правильно реагирует при просмотре из Firefox или Chrome, но вызов .ajax выше вызывает ошибки. Как мне обработать "предполетную" проверку в коде .ajax? Может быть, мне следует решить эту проблему с помощью логики .ajax на стороне клиента? Или, если это проблема на стороне сервера из-за не обработки команды OPTIONS.
Кто-нибудь может помочь? Это должно быть очень распространенная проблема, и я прошу прощения, если здесь был дан ответ. Я искал, но не нашел ответов, которые помогли бы.
ОБНОВЛЕНИЕ IMHO, это проблема на стороне клиента и связана с приведенным выше кодом Ajax JQuery. Я говорю это потому, что Fiddler не показывает никаких заголовков ошибок 405, когда я обращаюсь к mywebapidomain / api / user из веб-браузера. Единственное место, где я могу воспроизвести эту проблему, - это вызов JQuery .ajax (). Кроме того, идентичный вызов Ajax, приведенный выше, отлично работает при запуске на сервере (в том же домене).
Я нашел еще одно сообщение: запрос прототипа AJAX отправляется как ОПЦИИ, а не GET; приводит к ошибке 501, которая кажется связанной, но я безуспешно возился с их предложениями. Судя по всему, JQuery закодирован так, что если запрос Ajax является кросс-доменом (каковым является мой), он добавляет пару заголовков, которые каким-то образом запускают заголовок OPTIONS.
'X-Requested-With': 'XMLHttpRequest',
'X-Prototype-Version': Prototype.Version,
Просто кажется, что должно быть лучшее решение, чем изменение основного кода в JQuery ...
В приведенном ниже ответе предполагается, что это проблема на стороне сервера. Может быть, я думаю, но я склоняюсь к клиенту, и звонок хостинг-провайдеру не поможет.