Skonfigurowałem aplikację internetową ASP.NET, zaczynając od szablonu MVC 4 / Web API. Wygląda na to, że wszystko działa naprawdę dobrze - żadnych problemów, których jestem świadomy. Użyłem przeglądarki Chrome i Firefox do przeglądania witryny. Przetestowałem za pomocą programu Fiddler i wszystkie odpowiedzi wydają się dotyczyć pieniędzy.
Więc teraz przystępuję do pisania prostego pliku Test.aspx, aby korzystać z tego nowego internetowego interfejsu API. Odpowiednie części scenariusza:
<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>
To generuje nagłówek 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
W obecnej postaci interfejs API sieci Web zwraca metodę 405 niedozwoloną.
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>
Rozumiem, że zlecenie OPTIONS nie jest domyślnie podłączone do kontrolerów Web API ... Więc umieściłem następujący kod w moim UserController.cs:
// OPTIONS http-verb handler
public HttpResponseMessage OptionsUser()
{
var response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
return response;
}
... i to wyeliminowało błąd 405 Method Not allowed, ale odpowiedź jest całkowicie pusta - żadne dane nie są zwracane:
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
Musi być dodatkowa logika ... Nie wiem, jak poprawnie zakodować metodę Options lub czy kontroler jest nawet odpowiednim miejscem do umieszczenia kodu. Dziwne (dla mnie), że witryna interfejsu API sieci Web reaguje prawidłowo, gdy jest wyświetlana w przeglądarce Firefox lub Chrome, ale wywołanie .ajax powyżej zawiera błędy. Jak obsłużyć sprawdzanie „preflight” w kodzie .ajax? Może powinienem zająć się tym problemem w logice .ajax po stronie klienta? Lub, jeśli jest to problem po stronie serwera z powodu nieobsługiwania czasownika OPTIONS.
Czy ktoś może pomóc? To musi być bardzo częsty problem i przepraszam, jeśli został tutaj rozwiązany. Szukałem, ale nie znalazłem żadnych odpowiedzi, które pomogły.
UPDATE IMHO, jest to problem po stronie klienta i ma związek z powyższym kodem Ajax JQuery. Mówię to, ponieważ Fiddler nie wyświetla żadnych nagłówków błędów 405, gdy uzyskuję dostęp do mywebapidomain / api / user z przeglądarki internetowej. Jedynym miejscem, w którym mogę powielić ten problem, jest wywołanie JQuery .ajax (). Ponadto identyczne wywołanie Ajax powyżej działa dobrze, gdy jest uruchomione na serwerze (w tej samej domenie).
Znalazłem inny post: Prototypowe żądanie AJAX jest wysyłane jako OPCJE, a nie GET; skutkuje błędem 501, który wydaje się być powiązany, ale bezskutecznie majstrowałem przy ich sugestiach. Najwyraźniej JQuery jest zakodowany w taki sposób, że jeśli żądanie Ajax jest międzydomenowe (które jest moim), dodaje kilka nagłówków, które w jakiś sposób wyzwalają nagłówek OPTIONS.
'X-Requested-With': 'XMLHttpRequest',
'X-Prototype-Version': Prototype.Version,
Po prostu wydaje się, że powinno być dostępne lepsze rozwiązanie niż modyfikacja kodu rdzenia w JQuery ...
Poniższa odpowiedź zakłada, że jest to problem po stronie serwera. Może, tak myślę, ale skłaniam się ku klientowi i dzwonienie do dostawcy hostingu nie pomoże.