Ich habe eine ASP.NET-Webanwendung eingerichtet, die mit einer MVC 4 / Web-API-Vorlage beginnt. Es scheint, als ob die Dinge wirklich gut funktionieren - keine Probleme, die mir bewusst sind. Ich habe Chrome und Firefox verwendet, um die Website zu durchsuchen. Ich habe mit Fiddler getestet und alle Antworten scheinen auf dem Geld zu sein.
Jetzt schreibe ich eine einfache Test.aspx, um diese neue Web-API zu verwenden. Die relevanten Teile des Skripts:
<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>
Dies erzeugt einen REQUEST-Header:
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
Die Web-API gibt eine 405-Methode zurück, die nicht zulässig ist.
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>
Ich verstehe, dass das Verb OPTIONS standardmäßig nicht in Web-API-Controllern verkabelt ist ... Also habe ich den folgenden Code in meine UserController.cs eingefügt:
// OPTIONS http-verb handler
public HttpResponseMessage OptionsUser()
{
var response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.OK;
return response;
}
... und dies beseitigte den Fehler 405 Method Not Allowed, aber die Antwort ist vollständig leer - es werden keine Daten zurückgegeben:
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
Es muss zusätzliche Logik geben ... Ich weiß nicht, wie man die Options-Methode richtig codiert oder ob der Controller überhaupt der richtige Ort ist, um den Code einzufügen. Seltsam (für mich), dass die Web-API-Site bei Betrachtung von Firefox oder Chrome richtig reagiert, der obige .ajax-Aufruf jedoch Fehler ausgibt. Wie gehe ich mit der "Preflight" -Prüfung im .ajax-Code um? Vielleicht sollte ich dieses Problem in der .ajax-Logik der Client-Seite ansprechen? Oder wenn dies ein Problem auf der Serverseite ist, weil das Verb OPTIONS nicht behandelt wird.
Kann jemand helfen? Dies muss ein sehr häufiges Problem sein und ich entschuldige mich, wenn es hier beantwortet wurde. Ich habe gesucht, aber keine Antworten gefunden, die geholfen haben.
UPDATE IMHO, dies ist ein clientseitiges Problem und hat mit dem obigen Ajax JQuery-Code zu tun. Ich sage dies, weil Fiddler keine 405-Fehlerheader anzeigt, wenn ich über einen Webbrowser auf mywebapidomain / api / user zugreife. Der einzige Ort, an dem ich dieses Problem duplizieren kann, ist der Aufruf von JQuery .ajax (). Der oben genannte identische Ajax-Aufruf funktioniert auch einwandfrei, wenn er auf dem Server (derselben Domäne) ausgeführt wird.
Ich habe einen anderen Beitrag gefunden: Prototyp-AJAX-Anfrage wird als OPTIONS anstatt als GET gesendet; führt zu 501 Fehlern , die verwandt zu sein scheinen, aber ich habe an ihren Vorschlägen ohne Erfolg herumgebastelt. Anscheinend ist JQuery so codiert, dass, wenn eine Ajax-Anfrage domänenübergreifend ist (was meine ist), ein paar Header hinzugefügt werden, die den OPTIONS-Header irgendwie auslösen.
'X-Requested-With': 'XMLHttpRequest',
'X-Prototype-Version': Prototype.Version,
Es scheint nur, dass es eine bessere Lösung geben sollte, als den Kerncode in JQuery zu ändern ...
Bei der folgenden Antwort wird davon ausgegangen, dass es sich um ein serverseitiges Problem handelt. Vielleicht, denke ich, aber ich neige mich zum Kunden und es wird nicht helfen, einen Hosting-Anbieter anzurufen.