How to set custom “Host” header in HttpWebRequest?

后端 未结 5 960
自闭症患者
自闭症患者 2020-12-11 06:54

How can I set a custom Host header in HttpWebRequest? I know that normally this class doesn\'t allow you to do so but is there anyway to use reflection or something like tha

5条回答
  •  一整个雨季
    2020-12-11 07:04

    You can use this hack, designed for solve this problem in .Net 3.5 .

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Net;
    using System.Reflection;
    
    
    namespace ConsoleApplication6
    {
        class Program
        {
            static void Main(string[] args)
            {
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://198.252.206.16");
    
                FieldInfo headersFieldInfo =  request.GetType().GetField("_HttpRequestHeaders", System.Reflection.BindingFlags.NonPublic
                                                        | System.Reflection.BindingFlags.Instance
                                                        | System.Reflection.BindingFlags.GetField);
    
                CusteredHeaderCollection WssHeaders = new CusteredHeaderCollection("stackoverflow.com");
    
                headersFieldInfo.SetValue(request, WssHeaders);
    
                request.Proxy = null;
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
    
                StreamReader sr = new StreamReader(response.GetResponseStream());
                string result = sr.ReadToEnd();
                Console.WriteLine(result);
                Console.ReadLine();
    
            }
            public class CusteredHeaderCollection : WebHeaderCollection
            {
                public bool HostHeaderValueReplaced { get;private  set; }
    
                public string ClusterUrl { get; private set; }
    
                public CusteredHeaderCollection(string commonClusterUrl) : base()
                {
                    if (string.IsNullOrEmpty("commonClusterUrl"))
                        throw new ArgumentNullException("commonClusterUrl");
    
                    this.ClusterUrl = commonClusterUrl;
                }
    
                public override string ToString()
                {
                    this["Host"] = this.ClusterUrl;
                    string tmp =  base.ToString();
                    this.HostHeaderValueReplaced = true;
    
                    return tmp;
                }
    
            }
        }
    }
    

提交回复
热议问题