【问题标题】:Adding headers to c# HTTP server将标头添加到 c# HTTP 服务器
【发布时间】:2015-12-01 23:50:54
【问题描述】:

我正在尝试使用“C# 中的简单 HTTP 服务器”(http://www.codeproject.com/Articles/137979/Simple-HTTP-Server-in-C)在 C# 中创建一个 HTTP 服务器(侦听器),并使用 javascript 向它发送请求。

这就是代码的样子:

The HandleRequest function in c#:
public override void handleGETRequest(HttpProcessor p)
        {
            p.httpHeaders.Add("Access-Control-Allow-Origin", "*");

            if (p.http_url.Equals("/test"))
            {
                p.outputStream.Write("Test accomplished");
                Console.Log("Server responded to TEST request successfully");
                return;
            }
            if (p.http_url.StartsWith("/goto"))
            {
                string[] args = p.http_url.Split('/');
                //x - [2]
                //y - [3]
                //z - [4]
                //f - [5]
                myPrinter.SendCommand(string.Format("G1X{0}Y{1}F10000", args[2], args[3]));
                p.outputStream.Write("response succeeded");
                Console.Log("goto command was executed");
            }
            if (p.http_url.StartsWith("/commandlist"))
            {
                string[] args = p.http_url.Split('/');
                //[2] - commands
                string[] commands = args[2].Split('$');
                for (int i = 0; i < commands.Length; i++)
                {
                    myPrinter.commands.Add(commands[i]);
                }
                //myPrinter.HandleCommandList();
                p.outputStream.Write("response succeeded");
                Console.Log("goto command was executed");
            }
            if (p.http_url.StartsWith("/execute"))
            {
                p.outputStream.Write("Executing " + myPrinter.commands.Count + " commands\n");
                myPrinter.HandleCommandList();
            }
        }

在JS中发送的请求是这样的:

function sendGCODE() {
    var xmlhttp = new XMLHttpRequest();
    var url = "http://localhost:1300/commandlist/" + document.getElementById("Text1").value;

    xmlhttp.onreadystatechange = function () {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            var myArr = xmlhttp.responseText;
            myFunction(myArr);
        }
    };

    xmlhttp.open("GET", url, true);
    xmlhttp.send();

    function myFunction(arr) {
        alert('Response received');
        document.getElementById("resultP").innerHTML = arr;
    }
}

但是当我尝试从 JS 代码发送请求时,它只是告诉我缺少“Access-Control-Allow-Origin”标头,因此无法发送请求。我在 handleGETRequest() 函数的开头添加了该标题:

public override void handleGETRequest(HttpProcessor p)
        {
            p.httpHeaders.Add("Access-Control-Allow-Origin", "*");

那么为什么它不起作用?服务端软件没有报错,但是JS代码还是因为缺少header而心烦。

我做错了什么?谢谢! (其余的服务器端代码在上面的链接中)

【问题讨论】:

  • 能否使用 Fiddler(或浏览器开发工具)检查响应是否包含标头?

标签: javascript c# xmlhttprequest


【解决方案1】:

我认为您应该为您的服务器启用 CORS 以接受这些请求,看看这个 guide ,也许它会有所帮助。

【讨论】:

  • 本指南使用了一种叫做 HttpConfiguration 的东西,这是我使用的代码中没有用到的东西……我得到的代码中怎么能做到这一点?
  • 我看到您使用的是 Mozilla XMLHttpRequest,认为问题出在 javascript 方面,这是另一个链接,您可以查找信息,这是一个非常荒谬的主题,它取决于许多因素,例如作为服务器配置和 js 请求处理,我记得要花几个小时才能让它在 java 上运行,我不知道你做错了什么,但也许你可以在这些页面中找到你的答案。 developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS
  • 感谢您的帮助。最终我遇到了问题。我正在添加一个标题,但它没有发送,所以我只需要使用 p.outputStream.WriteLine("Access-Control-Allow-Origin: *"); 将标题作为普通行发送
猜你喜欢
  • 1970-01-01
  • 2015-07-19
  • 1970-01-01
  • 2013-06-11
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 2016-02-15
  • 1970-01-01
相关资源
最近更新 更多