Ich gehe davon aus, dass Sie ashx
zu schreiben bedeutete, nicht ascx
. Das Vorhandensein der ProcessRequest (HttpContext context)
Methode schlägt vor, dass es ein generischer Handler und kein Benutzersteuerelement ist.
Ich habe eine sehr einfache Seite gemacht haben mit testen:
<%@ Page Language="C#" AutoEventWireup="true" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<script type="text/javascript" src="Scripts/jquery-1.4.1.js"></script>
</head>
<body>
<div id="testCorsDiv">
</div>
<script type="text/javascript">
$.ajax({
type: "GET",
url: "/Handler/testCors.ashx",
dataType: "text",
success: function (theData) { $("#testCorsDiv").text(theData); },
error: function (theData) { alert('error'); }
});
</script>
<% if(string.IsNullOrEmpty(Request.QueryString["sandboxed"])) { %>
<iframe src="http://127.0.0.1:49253/SandboxTest.aspx?sandboxed=true" sandbox="allow-scripts" width="600">
</iframe>
<% } %>
</body>
</html>
lade ich die Seite auf http://localhost:49253/SandboxTest.aspx
. Die Seite macht dann eine ajax
Anfrage an http://localhost:49253/Handler/testCors.ashx
und setzt die Ausgabe davon in die testCorsDiv
div. Dies erzeugt eine direkte GET
an den Handler (da es vom selben Ursprung kommt) und die Ausgabe wird eingefügt.
In der Seite ist auch eine Sandbox iframe
, die die gleiche Seite lädt mit der URL http://127.0.0.1:49253/SandboxTest.aspx
. Die ?sandboxed=true
ist da, um zu verhindern, dass der Iframe einen inneren Iframe rekursiv lädt. Die im iframe geladene Seite versucht dann, eine Ajax-Anfrage an http://127.0.0.1:49253/Handler/testCors.ashx
zu senden und die Ausgabe in ihrer eigenen Kopie des testCorsDiv
div anzuzeigen.
Solange der Sandboxed iframe allow-scripts
hat, funktioniert das wie ein Charme. Die iframe
erzeugt ein OPTIONS
Anfrage wie folgt aussehen (von Fiddler, mit Chrome getestet):
OPTIONS http://127.0.0.1:49253/Handler/testCors.ashx HTTP/1.1
Host: 127.0.0.1:49253
Connection: keep-alive
Cache-Control: max-age=0
Access-Control-Request-Method: GET
Origin: null
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.90 Safari/537.36
Access-Control-Request-Headers: accept, x-requested-with
Accept: */*
Referer: http://127.0.0.1:49253/SandboxTest.aspx?sandboxed=true
Accept-Encoding: gzip, deflate, sdch
Accept-Language: fi-FI,fi;q=0.8,en-US;q=0.6,en;q=0.4
Mein testCors.ashx
Handler dann einige Header ausspuckt, die besagt, dass das sieht ay-ok und der Browser folgt dann nach oben mit einem GET
und es funktioniert einfach.
Die testCors.ashx
tut dies:
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
context.Response.AppendHeader("Access-Control-Allow-Origin", "*");
context.Response.AppendHeader("Access-Control-Allow-Headers", "content-type, x-requested-with, accept");
context.Response.AppendHeader("Access-Control-Allow-Methods", "POST, OPTIONS, GET");
context.Response.Write("Hello World");
}
So meinen Tests legen nahe, dass es möglich sein sollte, zu tun, was Sie wollen. Eine Sache jedoch, die ein Problem sein könnte, ist, wenn Ihr Handler nur für authentifizierte/autorisierte Benutzer zugänglich ist. Wie Sie sehen können, hat die OPTIONS
Anfrage kein Cookie an den Handler gesendet. Auf der anderen Seite sagt Ihre Frage, dass die Antwort auf Ihre Optionen-Anfrage Status Code:200
ist. Ich nehme an, das wäre etwas 4**
, wenn ein erforderliches Authentifizierungs-Cookie fehlte.
Ich schreibe auf, ich weiß nicht wirklich, was in Ihrem Fall falsch ist, aber vielleicht (?) Kann meine einfache Beispielseite Ihnen einige Hinweise geben, die Ihnen helfen, das Problem selbst zu finden.
Vielen Dank, mit Ihrem Beispiel habe ich es geschafft, das Problem einfach neu zu erstellen, und dann mit einigen Optimierungen hat es funktioniert! –
@TomGullen Froh, dass meine Antwort hilfreich war. Und danke für die Belohnung, schätze es, auch wenn ich nicht sicher bin, dass ich es verdient habe, da ich dein Problem nicht wirklich gelöst habe ... – user1429080