Я установил веб-приложение ASP.NET, начиная с шаблона MVC 4/Web API. Кажется, что все работает очень хорошо - никаких проблем, о которых я знаю. Я использовал Chrome и Firefox, чтобы пройти через сайт. Я тестировал использование Fiddler, и все ответы, похоже, были на деньги.
Итак, теперь я перехожу к написанию простого Test.aspx, чтобы использовать этот новый веб-API. Соответствующие части script:
<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
Должна быть дополнительная логика... Я не знаю, как правильно закодировать метод "Параметры", или если контроллер - это даже подходящее место для размещения кода. Странно (мне), что сайт веб-API правильно реагирует при просмотре с Firefox или Chrome, но ошибка .ajax выше ошибок. Как я могу обработать проверку "предполетного" кода .ajax? Может быть, мне стоит решить эту проблему на стороне клиента. Или, если это проблема на стороне сервера из-за отсутствия обработки глагола OPTIONS.
Может ли кто-нибудь помочь? Это должна быть очень распространенная проблема, и я приношу свои извинения, если на это был дан ответ. Я искал, но не нашел ответов, которые помогли.
UPDATE 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...
В приведенном ниже ответе предполагается, что это проблема на стороне сервера. Возможно, я думаю, но я склоняюсь к клиенту, и вызов хостинг-провайдера не поможет.