HttpListener 的 CORS 访问

Posted

技术标签:

【中文标题】HttpListener 的 CORS 访问【英文标题】:CORS access for HttpListener 【发布时间】:2014-10-15 17:46:13 【问题描述】:

我有一个 C# 控制台应用程序,运行 HttpListener,我的客户因为 CORS 而被拒绝。

如何使用我的设置将Access-Allow-All-Origins 设置为*

listener = new HttpListener();
listener.Prefixes.Add("http://+:80/");
listener.Start();

    public static void ListenerCallback(IAsyncResult result)
    
        HttpListenerContext context = Program.listener.EndGetContext(result);
        HttpListenerRequest request = context.Request;
        HttpListenerResponse response = context.Response;
        if (request.HttpMethod == "OPTIONS")
        
            response.AddHeader("Access-Control-Allow-Headers", "*");
        
        response.AppendHeader("Access-Control-Allow-Origin", "*");
        System.IO.Stream stream = new System.IO.MemoryStream();
        request.InputStream.CopyTo(stream);
        stream.Position = 0;
        NameValueCollection coll = request.QueryString;

        if (String.IsNullOrEmpty(coll["name"]) || String.IsNullOrEmpty(coll["ext"]))
        
            response.StatusCode = 400;
            response.ContentType = "text/html";
            using (StreamWriter writer = new StreamWriter(context.Response.OutputStream, Encoding.UTF8))
                writer.WriteLine("Missing parameters in queryString. Send 'name' and 'ext'");
            response.Close();
        
        else
        
            Program.nameResDictionary.Add(coll["name"] + "." + coll["ext"], response);
            using (var outp = File.OpenWrite(Path.Combine(Program.inDir,coll["name"] + "." + coll["ext"])))
            
                stream.CopyTo(outp);
            

            toLog.Add("File " + coll["name"] + "." + coll["ext"] + " added");
        
        stream.Close();
        request.InputStream.Close();
        listener.BeginGetContext(new AsyncCallback(ListenerCallback), listener);
    

【问题讨论】:

@AlexeiLevenkov 添加代码 您的代码似乎尝试在 OPTIONS 上设置标题两次,并可能为 OPTIONS 做更多的事情...我会使用 Fiddler 并观察来自您的服务器的响应是否有意义...还要检查是否浏览器在调试控制台中显示任何内容... 【参考方案1】:

根据我看到的从我们在 IIS 中执行的其他一些 CORS 内容返回的 OPTIONS 响应,以下内容对我有用 HttpListener。这些值可能并不完全适合您,但应该能让您朝着正确的方向前进。

if (request.HttpMethod == "OPTIONS")

    response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With");
    response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
    response.AddHeader("Access-Control-Max-Age", "1728000");

response.AppendHeader("Access-Control-Allow-Origin", "*");

【讨论】:

【参考方案2】:

一种简单的方法是在您的 ajax 调用中使用 JSONP,如下所示:

 $.support.cors = true;
    $.ajax(
        type: "POST",
        crossdomain: true,
        contentType: "application/json; charset=utf-8",
        url: ServiceURL,
        dataType: "jsonp",
        data:  Param1 : 'Test',
        success: function (data) 
        

您的处理程序将如下所示:

 public void ProcessRequest(HttpContext context)
        
            context.Response.ContentType = "application/json";
            string callback = context.Request.QueryString["callback"];
            string Param1 = context.Request.QueryString["Param1"];
            object dataToSend = null;
            javascriptSerializer js = new JavaScriptSerializer();
            string JSONstring = js.Serialize(dataToSend);
            string JSONPstring = string.Format("0(1);", callback, JSONstring);
            context.Response.Write(JSONPstring);
        

以上代码将响应转换为 JSONP。 callback参数是ajax调用自动添加的,应该返回给客户端

【讨论】:

JSONP 实际上是一种更简单的方法,但是这个公认的答案并没有回答所提出的问题。首选答案应描述如何允许 HttpListener 以允许 CORS 的方式响应。

以上是关于HttpListener 的 CORS 访问的主要内容,如果未能解决你的问题,请参考以下文章

使用 HttpListener 访问键/值对

HttpListener“访问被拒绝”,尝试将 url 添加到 ACL

如何防止 HttpListener 在停止时中止挂起的请求? HttpListener.Stop 不起作用

用HttpListener开发HTTP服务器靠谱吗

替代 HttpListener?

带有发布数据的 httplistener