Я налаштував веб-програму 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>
Це генерує заголовок ЗАПИТ:
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 Метод не дозволено, але відповідь повністю порожня - дані не повертаються:
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.
Хто-небудь може допомогти? Це має бути дуже поширене питання, і я перепрошую, якщо на нього відповіли тут. Я шукав, але не знайшов відповідей, які допомогли.
UPDATE IMHO, це проблема на стороні клієнта і пов’язана з наведеним вище кодом Ajax JQuery. Я кажу це тому, що Fiddler не відображає заголовків помилок 405, коли я отримую доступ до mywebapidomain / api / user із веб-браузера. Єдине місце, де я можу повторити цю проблему, - це виклик JQuery .ajax (). Крім того, ідентичний виклик Ajax вище чудово працює, коли запускається на сервері (той же домен).
Я знайшов інший допис: запит прототипу AJAX надсилається як ОПЦІЇ, а не ОТРИМАЄ; призводить до помилки 501, яка, здається, пов’язана, але я поспілкувався з їх пропозиціями без успіху. Очевидно, JQuery кодується так, що якщо запит Ajax є міждоменним (яким є мій), він додає пару заголовків, які якось запускають заголовок OPTIONS.
'X-Requested-With': 'XMLHttpRequest',
'X-Prototype-Version': Prototype.Version,
Просто здається, що має бути краще рішення, ніж модифікація основного коду в JQuery ...
Відповідь, наведена нижче, передбачає, що це проблема сторони сервера. Можливо, я здогадуюсь, але я схиляюся до клієнта, і дзвінок провайдеру хостингу не допоможе.