Tôi cho rằng bạn có nghĩa là để viết ashx
, không ascx
. Sự hiện diện của phương thức ProcessRequest (HttpContext context)
cho thấy đó là một trình xử lý chung và không phải là điều khiển người dùng.
Tôi đã thực hiện một trang rất đơn giản để thử nghiệm với:
<%@ 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>
tôi tải trang trên http://localhost:49253/SandboxTest.aspx
. Sau đó, trang thực hiện yêu cầu ajax
tới http://localhost:49253/Handler/testCors.ashx
và đặt kết quả đầu ra từ đó vào số testCorsDiv
div. Điều này tạo ra một GET
thẳng cho trình xử lý (vì nó đến từ cùng một nguồn gốc) và đầu ra được chèn vào.
Trong trang cũng là hộp cát iframe
tải cùng một trang bằng url http://127.0.0.1:49253/SandboxTest.aspx
. Các ?sandboxed=true
là có để ngăn chặn các iframe từ đệ quy tải một iframe bên trong. Sau đó, trang được tải trong khung nội tuyến sẽ cố gắng thực hiện yêu cầu ajax đến http://127.0.0.1:49253/Handler/testCors.ashx
và hiển thị đầu ra trong bản sao riêng của nó là div testCorsDiv
.
Miễn là khung nội tuyến có hộp cát có allow-scripts
, nó hoạt động như một nét duyên dáng. Các iframe
tạo ra một OPTIONS
yêu cầu tìm kiếm như thế này (từ Fiddler, thử nghiệm với 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
handler testCors.ashx
của tôi sau đó khạc nhổ ra một số tiêu đề mà nói rằng điều này có vẻ ay-ok và trình duyệt rồi sau lên với một GET
và nó chỉ hoạt động.
Các testCors.ashx
thực hiện điều này:
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");
}
Vì vậy, thử nghiệm của tôi cho thấy rằng chúng ta có thể làm những gì bạn muốn. Một điều mặc dù đó có thể là một vấn đề là nếu trình xử lý của bạn chỉ có thể truy cập được đối với người dùng được xác thực/ủy quyền. Như bạn có thể thấy yêu cầu OPTIONS
chưa gửi cookie tới trình xử lý. Nhưng mặt khác câu hỏi của bạn nói rằng phản ứng với yêu cầu tùy chọn của bạn là Status Code:200
. Tôi cho rằng đó sẽ là một số 4**
nếu thiếu cookie xác thực bắt buộc.
Kết thúc, tôi thực sự không biết có gì sai trong trường hợp của bạn, nhưng có thể (?) Trang mẫu đơn giản của tôi có thể cung cấp cho bạn một số manh mối giúp bạn tự tìm ra vấn đề.
Cảm ơn bạn, bằng cách sử dụng ví dụ của bạn tôi quản lý để tái tạo các vấn đề đơn giản, và sau đó với một số tinh chỉnh có nó làm việc! –
@TomGullen Rất vui khi câu trả lời của tôi là giúp đỡ. Và cảm ơn vì tiền thưởng, đánh giá cao nó ngay cả khi tôi không chắc chắn rằng tôi xứng đáng vì tôi đã không thực sự giải quyết vấn đề của bạn ... – user1429080