6
votes

Comment définir une en-tête de "hôte" personnalisée dans httpwebrequest?

Comment puis-je définir un en-tête d'hôte personnalisé dans httpwebrequest? Je sais que normalement que cette classe ne vous permet pas de le faire, mais existe-t-il de toute façon d'utiliser la réflexion ou quelque chose du genre sans avoir besoin de moi pour envoyer tout le paquet avec tcpclient?


3 commentaires

Qu'est-ce que vous voulez changer exactement dans l'en-tête? Parce que la plupart des paramètres d'en-tête peuvent être indirectement modifiés par des propriétés


Pourquoi avez-vous besoin de définir l'en-tête "hôte" par vous-même. Si vous apportez une demande à www.google.com , il devient simplement en-tête d'hôte.


@Yannick Hôte et autres paramètres réservés ne peuvent pas.


5 Réponses :


5
votes

Il y a un chemin de rond-point pour le faire, comme décrit ici:

http://blogs.msdn.com/feroze_daud/ Archives / 2005/03/31 / 404328.aspx

Cependant, la prochaine version du cadre (.NET Framework 4.0) facilitera la tâche.

http://blogs.msdn.com/ncl/archive/2009/07/20/new-ncl-features-in-net-4-0-beta-.aspx

J'espère que cela aide.


1 commentaires

J'ai vu cette page bien qu'il y ait beaucoup de problèmes dans cette solution de contournement à côté de cela c'est une solution de contournement vraiment sale :)



0
votes

Vous pouvez utiliser le proxy, voir ma réponse à: Page Web de la page de la demande en C # Spoofing L'hôte


0 commentaires

2
votes

Vous pouvez utiliser ce piratage, conçu pour résoudre ce problème dans .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;
            }

        }
    }
}


0 commentaires

1
votes

WebClient le permet.

var client = new WebClient();
client.Headers.Add( "Host", WebHeader );


3 commentaires

C'est parce que cela ne fonctionne pas - l'en-tête d'une exception ne peut pas être modifié directement.


Ne fonctionne pas. ArgumentException: Cet en-tête doit être modifié avec la propriété appropriée.


Cela fonctionne littéralement. Comme je l'ai dit, courir en production. System.net.webclient. Cible 3.5



3
votes

Nécromancement. de
Pour ceux toujours sur .NET 2.0
C'est en fait assez facile, si vous savez comment.

Problème est que vous ne pouvez pas définir l'en-tête d'hôte, car le framework ne vous permettra pas de modifier la valeur au moment de l'exécution. (.NET Framework 4.0+ vous permettra de remplacer l'hôte dans un httpwebrequest).

prochaine tentative définira l'en-tête avec réflexion, ce qui vous permettra de changer la valeur d'en-tête. Mais au moment de l'exécution, il écrasera cette valeur avec la partie hôte de l'URL, ce qui signifie que la réflexion ne vous apportera rien.

Si le nom DNS n'existe pas, ce qui est franchement le seul cas dans lequel vous voulez le faire en premier lieu, vous ne pouvez pas la définir, car .NET ne peut pas résoudre et vous ne pouvez pas remplacer le résolveur DNS .NET.

Mais ce que vous pouvez faire, définit une webproxy avec exactement la même adresse IP que le serveur de destination.

Donc, si votre adresse IP du serveur est 28.14.88.71:< xxx < p> Et vous obtenez la page correcte de la page, si le 28.14.88.71 est un serveur Web avec hébergement basé sur le nom virtuel (basé sur HTTP-Host-Header).


1 commentaires

Nice, pour .NET 2.0. Évidemment, cela ne fonctionnera pas si vous devez réellement utiliser un serveur proxy;) Just Mettez à jour sur .NET 4.5 Déjà - WebRequest et WebClient sont tous deux obsolètes de toute façon.