webentwicklung-frage-antwort-db.com.de

Wie sett man useUnsafeHeaderParsing im Code ein?

Ich bekomme die folgende Ausnahme:

Der Server hat eine Protokollverletzung begangen. Section = ResponseHeader Detail = CR muss von LF gefolgt werden

Aus dieser Frage:

HttpWebRequestError: Der Server hat eine Protokollverletzung begangen. Section = ResponseHeader Detail = CR muss von LF gefolgt werden

Ich verstehe, dass ich useUnsafeHeaderParsing auf True setzen muss. 

Hier ist mein Code:

HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);
WebResponse myResp = myReq.GetResponse(); //exception is thrown here

useUnsafeHeaderParsing ist eine Eigenschaft der HttpWebRequestElement-Klasse.

Wie füge ich es in den obigen Code ein?

17
Barka

Sie müssen dies in Ihrer web.config im Abschnitt <system.net> wie folgt einstellen:

<system.net> 
  <settings> 
   <httpWebRequest useUnsafeHeaderParsing="true" /> 
  </settings> 
</system.net> 

Wenn Sie es aus irgendeinem Grund nicht von Ihrer Konfiguration aus tun möchten, können Sie dies vom Code aus tun, indem Sie Ihre Konfigurationseinstellungen prgrammatisch einstellen. Siehe diese Seite für ein Beispiel.

31
Edwin de Koning

Wie Edwin darauf hingewiesen hat, müssen Sie das useUnsafeHeaderParsing-Attribut in Ihrer Datei web.config oder app.config festlegen. Wenn Sie den Wert zur Laufzeit wirklich dynamisch ändern möchten, müssen Sie auf die Reflektion zurückgreifen, da der Wert in einer Instanz von System.Net.Configuration.SettingsSectionInternal verankert und nicht öffentlich zugänglich ist.

Hier ist ein Codebeispiel (basierend auf den gefundenen Informationen here ), das den Trick ausführt:

using System;
using System.Net;
using System.Net.Configuration;
using System.Reflection;

namespace UnsafeHeaderParsingSample
{
    class Program
    {
        static void Main()
        {
            // Enable UseUnsafeHeaderParsing
            if (!ToggleAllowUnsafeHeaderParsing(true))
            {
                // Couldn't set flag. Log the fact, throw an exception or whatever.
            }

            // This request will now allow unsafe header parsing, i.e. GetResponse won't throw an exception.
            var request = (HttpWebRequest) WebRequest.Create("http://localhost:8000");
            var response = request.GetResponse();

            // Disable UseUnsafeHeaderParsing
            if (!ToggleAllowUnsafeHeaderParsing(false))
            {
                // Couldn't change flag. Log the fact, throw an exception or whatever.
            }

            // This request won't allow unsafe header parsing, i.e. GetResponse will throw an exception.
            var strictHeaderRequest = (HttpWebRequest)WebRequest.Create("http://localhost:8000");
            var strictResponse = strictHeaderRequest.GetResponse();
        }

        // Enable/disable useUnsafeHeaderParsing.
        // See http://o2platform.wordpress.com/2010/10/20/dealing-with-the-server-committed-a-protocol-violation-sectionresponsestatusline/
        public static bool ToggleAllowUnsafeHeaderParsing(bool enable)
        {
            //Get the Assembly that contains the internal class
            Assembly assembly = Assembly.GetAssembly(typeof(SettingsSection));
            if (Assembly != null)
            {
                //Use the Assembly in order to get the internal type for the internal class
                Type settingsSectionType = Assembly.GetType("System.Net.Configuration.SettingsSectionInternal");
                if (settingsSectionType != null)
                {
                    //Use the internal static property to get an instance of the internal settings class.
                    //If the static instance isn't created already invoking the property will create it for us.
                    object anInstance = settingsSectionType.InvokeMember("Section",
                    BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.NonPublic, null, null, new object[] { });
                    if (anInstance != null)
                    {
                        //Locate the private bool field that tells the framework if unsafe header parsing is allowed
                        FieldInfo aUseUnsafeHeaderParsing = settingsSectionType.GetField("useUnsafeHeaderParsing", BindingFlags.NonPublic | BindingFlags.Instance);
                        if (aUseUnsafeHeaderParsing != null)
                        {
                            aUseUnsafeHeaderParsing.SetValue(anInstance, enable);
                            return true;
                        }

                    }
                }
            }
            return false;
        }
    }
}
26
afrischke

Wenn Sie Reflection nicht verwenden möchten, können Sie folgenden Code ausprobieren (Referenz System.Configuration.dll):

using System.Configuration;
using System.Net.Configuration;

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
var settings = (SettingsSection)config.GetSection("system.net/settings");
settings.HttpWebRequest.UseUnsafeHeaderParsing = true;
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("system.net/settings");
0
Geograph