Zakładam, że masz na myśli napisać ashx
, nie ascx
. Obecność metody ProcessRequest (HttpContext context)
sugeruje, że jest to ogólny program obsługi, a nie kontrola użytkownika.
zrobiłem bardzo prostą stronę do przetestowania z:
<%@ 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>
załadować stronę na http://localhost:49253/SandboxTest.aspx
. Strona następnie wysyła żądanie ajax
do http://localhost:49253/Handler/testCors.ashx
i umieszcza na nim dane wyjściowe w jednostce div testCorsDiv
. Generuje to prostą GET
do obsługi (ponieważ pochodzi z tego samego pochodzenia), a wyjście zostaje wstawione.
Na stronie znajduje się również piaskownica iframe
, która ładuje tę samą stronę przy użyciu adresu URL http://127.0.0.1:49253/SandboxTest.aspx
. Numer ?sandboxed=true
uniemożliwia elementowi iframe ładowanie rekursywne wewnętrznego elementu iframe. Strona wczytana w ramce iframe następnie spróbuje wysłać żądanie ajax do http://127.0.0.1:49253/Handler/testCors.ashx
i wyświetlić wyjście w swojej własnej kopii elementu testCorsDiv
div.
Tak długo jak piaskownica iframe ma allow-scripts
działa to jak czar. iframe
generuje OPTIONS
wniosek patrząc tak (z Skrzypek, przetestowane z Chrome):
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
Moja testCors.ashx
obsługi następnie wypluwa kilka nagłówków, które mówi, że wygląda to ay-ok, a przeglądarka następnie śledzi z GET
i po prostu działa.
testCors.ashx
robi to:
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");
}
Więc moje badania sugerują, że powinno być możliwe, aby robić to, co chcesz. Jedną z rzeczy, która może być problemem jest to, że twój przewodnik jest dostępny tylko dla uwierzytelnionych/autoryzowanych użytkowników. Jak widać, żądanie OPTIONS
nie wysłało pliku cookie do programu obsługi. Ale z drugiej strony twoje pytanie mówi, że odpowiedź na twoje pytanie o opcje to Status Code:200
. Przypuszczam, że byłby to jakiś numer 4**
, gdyby brakowało wymaganego pliku cookie uwierzytelniającego.
Podsumowując, tak naprawdę nie wiem, co jest nie tak w twoim przypadku, ale może (?) Moja prosta przykładowa strona może dostarczyć ci wskazówek, które pomogą ci znaleźć problem.
Dziękuję, korzystając z tego przykładu, udało mi się w prosty sposób odtworzyć problem, a następnie z pewnymi zmianami działało! –
@TomGullen Cieszę się, że moja odpowiedź była pomocna. I dziękuję za nagrodę, doceń to, nawet jeśli nie jestem pewien, czy zasłużyłem na to, ponieważ tak naprawdę nie rozwiązałem twojego problemu ... – user1429080