2011-12-07 12 views
14

Otrzymuję następujący wyjątek:jak ustawić useUnsafeHeaderParsing w kodzie

Serwer popełnił naruszenie protokołu. Sekcja = ResponseHeader Detail = CR muszą być przestrzegane przez LF

Od tego pytania:

HttpWebRequestError: The server committed a protocol violation. Section=ResponseHeader Detail=CR must be followed by LF

Rozumiem, że muszę ustawić useUnsafeHeaderParsing True.

Oto mój kod:

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

useUnsafeHeaderParsing jest własnością HttpWebRequestElement klasie.

Jak mogę go zintegrować z powyższym kodem?

Wielkie dzięki!

Odpowiedz

27

trzeba ustawić to w pliku web.config, wewnątrz <system.net> sekcji, tak:

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

Jeśli z jakiegoś powodu nie chcesz to zrobić z config, można zrobić to z kodu przez prgrammatically ustawienie ustawień konfiguracyjnych. Zobacz przykład this page.

+0

jak dodać do tego kodu „app.config” w aplikacji C# formularza internetowego? – TheMuyu

23

Jak zauważył Edwin, należy ustawić atrybut useUnsafeHeaderParsing w pliku web.config lub app.config. Jeśli naprawdę chcesz zmienić wartość dynamicznie w środowisku wykonawczym, będziesz musiał odwołać się do refleksji, ponieważ wartość jest pochowana w instancji System.Net.Configuration.SettingsSectionInternal i nie jest publicznie dostępna.

Oto przykładowy kod (na podstawie informacji znalezionych here), który załatwia sprawę:

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; 
     } 
    } 
} 
+1

To jest to, czego potrzebowałem. DZIĘKUJĘ CI! – MatBee

+0

Wielu użytkowników wykonało mój program uruchamiający grę i program aktualizujący, ale połowa z nich miała błędy przy użyciu tego samego komunikatu co OP. Twoja odpowiedź naprawiła problem, bardzo dziękuję: D – G4BB3R

+0

Sześć lat później nadal jest przydatny. Dzięki! –

Powiązane problemy