【问题标题】:HttpListener Server Header c#HttpListener 服务器头 c#
【发布时间】:2021-07-19 10:25:19
【问题描述】:

我正在尝试为个人项目编写 C# http 服务器,我想知道如何将返回的服务器标头从 Microsoft-HTTPAPI/2.0 更改为其他内容?

 public class HttpWebServer
    {
        private HttpListener Listener;

        public void Start()
        {
            Listener = new HttpListener();
            Listener.Prefixes.Add("http://*:5555/");
            Listener.Start();
            Listener.BeginGetContext(ProcessRequest, Listener);
            Console.WriteLine("Connection Started");
        }

        public void Stop()
        {
            Listener.Stop();
        }

        private void ProcessRequest(IAsyncResult result)
        {
            HttpListener listener = (HttpListener)result.AsyncState;
            HttpListenerContext context = listener.EndGetContext(result);

            string responseString = "<html>Hello World</html>";
            byte[] buffer = Encoding.UTF8.GetBytes(responseString);

            context.Response.ContentLength64 = buffer.Length;
            System.IO.Stream output = context.Response.OutputStream;
            output.Write(buffer, 0, buffer.Length);
            output.Close();

            Listener.BeginGetContext(ProcessRequest, Listener);
        }
    }

【问题讨论】:

  • IIS7 速度更快,多线程优势
  • 在基本层面,我怀疑HttpListener调用http.sys,因此Http内核队列应该是一样的

标签: c# http httplistener


【解决方案1】:

HttpListener 类封装了本机 API,HttpSendHttpResponse Function,如链接中所述,它将始终将荒谬的文本附加到服务器标头信息中。

没有办法解决这个问题,除非你想从头开始编写 HttpListener。

【讨论】:

    【解决方案2】:

    我知道我来晚了,但我最近只是在尝试做同样的事情,我偶然发现了一个可行的解决方案,但我不确定它是否会产生任何影响。

    Response.Headers.Add("Server", "\r\n\r\n");
    

    【讨论】:

    • 是的,这一行本身会删除 Server 标头作为响应。但是当我添加另一个服务器标题后,我得到了这个:,我的服务器! Microsoft-HTTPAPI/2.0
    • TY!完全修复它!我的意思是添加我自己的会很酷,但是 /meh。
    • Response.Headers.Add("Server", ""); 也应该可以正常工作。
    • 这个奇怪的 hack 污染了有效载荷
    • 这不再起作用了。它只是引发了一个期望。或者有时,如果没有,它会删除其他标题,因为它们恰好在两个 \r\n 之后。
    【解决方案3】:

    我试过了,但它回来了 我的个人服务器 Microsoft-HTTPAPI/2.0

    我也用过,没有成功,set,remove,add,addheader

    private void ProcessRequest(IAsyncResult result)
            {
                HttpListener listener = (HttpListener)result.AsyncState;
                HttpListenerContext context = listener.EndGetContext(result);
    
                string responseString = "<html>Hello World</html>";
                byte[] buffer = Encoding.UTF8.GetBytes(responseString);
                context.Response.ContentLength64 = buffer.Length;
    
                //One
                context.Response.AddHeader("Server", "My Personal Server");
    
                //Two
                context.Response.Headers.Remove(HttpResponseHeader.Server);
                context.Response.Headers.Add(HttpResponseHeader.Server, "My Personal Server");
    
                //Three
                context.Response.Headers.Set(HttpResponseHeader.Server, "My Personal Server");
    
                System.IO.Stream output = context.Response.OutputStream;
                output.Write(buffer, 0, buffer.Length);
                output.Close();
    
                Listener.BeginGetContext(ProcessRequest, Listener);
            }
    

    谢谢 以利亚

    【讨论】:

      【解决方案4】:

      Arul 的回答是正确的,但是,正如 Iain Ballard 已经指出的那样,将 Server 标头设置为空字符串将起作用,这意味着根本不会发送 Server 标头。 然后,如果您必须让客户知道您的真棒应用程序的名称是什么,您可以随意添加“Via”标题。它的规范相当松散,可能会被大多数浏览器忽略。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-09-26
        • 2017-08-23
        • 1970-01-01
        • 2014-12-12
        • 2011-02-14
        • 2010-11-19
        • 1970-01-01
        • 2017-01-29
        相关资源
        最近更新 更多