【问题标题】:Cross-domain GET request not working in jQuery, with a C# backend server使用 C# 后端服务器的跨域 GET 请求在 jQuery 中不起作用
【发布时间】:2011-12-03 10:57:26
【问题描述】:

我在另一个域上托管了一个单独的 HTTP 服务器,用作我的后端服务器 (C#)。它创建一个 TcpListener,并在连接时创建一个新线程来处理连接。

我使用 jQuery 向该服务器发出 ajax get 请求,然后 jQuery 发送一个 OPTIONS 请求。经过一番研究,我将此段添加到我的程序中,希望之后它会继续处理 HTTP 请求。 (ns 是 NetworkStream 的一个实例,来自 TcpClient.GetStream())

if (req1.StartsWith("OPTIONS"))
            {
                //req1 = req1.Split('\n')[0].Substring(9);
                string headers = string.Format(
                    "HTTP/1.0 200 OK\r\n"+
               "Access-Control-Allow-Origin: *\r\n"+
               "Access-Control-Allow-Methods: *\r\n"+
               "Access-Control-Max-Age: 1728000\r\n"+
               "Access-Control-Allow-Headers: *\r\n"+
               "Connection: Keep-Alive\r\n"+
               "Content-Type: text/plain\r\n\r\n");
                ns.Write(Encoding.ASCII.GetBytes(headers), 0, Encoding.ASCII.GetBytes(headers).Length);
                ns.Close(); client.Close();  return;
            }

不幸的是,浏览器不断向服务器发送 OPTIONS 请求,即使服务器发回应该允许它无限制访问的 Access-Control 标头。

以下是其中 1 个请求的网络日志:http://pastebin.com/T07Whvem

有什么建议可以完成这项工作吗? javascript 代码非常简单,但我会包含它:

//this is just a long-poll
function waitForMsg(){

    $.ajax({
        url: "http://127.0.0.1:6969/2|||ub",
        dataType: "text",

       async: true, 
       cache: true,
        timeout:50000, 

        success: function(data){ 
            addmsg("new", data); 
            setTimeout(
                'waitForMsg()', 
                1000 
            );
        },
        error: function(XMLHttpRequest, textStatus, errorThrown){
            addmsg("error", textStatus + " (" + errorThrown + ")");
            setTimeout(
                'waitForMsg()', 
                "1000"); 
        },
    });
};

$(document).ready(function(){
    waitForMsg(); /* Start the inital request */
});

我不能使用现有的网络服务器,因为这不是真正的标准网络服务器;只是一个可以通过 http 接收指令的服务器。

谢谢!

【问题讨论】:

  • 拥有适当的 WCF 服务作为您的后端将大大有助于解决您的问题。

标签: c# javascript jquery http http-headers


【解决方案1】:

您需要在 jQuery 中启用以下设置

$(document).ready(function()
{
    $.support.cors = true;
});

见:http://api.jquery.com/jQuery.support/

【讨论】:

  • 谢谢,这行得通。这阻止了预飞行的发生,所以我只是在每个响应中包含了与 CORS 相关的标头。不是最理想的,但可以满足我的需要。
猜你喜欢
  • 2014-02-09
  • 2014-07-23
  • 2018-03-02
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多