Je reçois l'exception suivante:
Le serveur a commis une violation de protocole. Section = ResponseHeader Detail = CR doit être suivi de LF
De cette question:
Je comprends que je dois définir useUnsafeHeaderParsing sur True.
Voici mon code:
HttpWebRequest myReq = (HttpWebRequest)WebRequest.Create(url);
WebResponse myResp = myReq.GetResponse(); //exception is thrown here
useUnsafeHeaderParsing est une propriété de la classe HttpWebRequestElement.
Comment puis-je l'intégrer dans le code ci-dessus?
Vous devez définir ceci dans votre section web.config, dans la section <system.net>
, comme suit:
<system.net>
<settings>
<httpWebRequest useUnsafeHeaderParsing="true" />
</settings>
</system.net>
Si, pour une raison quelconque, vous ne souhaitez pas le faire à partir de votre configuration, vous pouvez le faire à partir de code en définissant de manière pragmatique vos paramètres de configuration. Voir cette page pour un exemple.
Comme Edwin l'a souligné, vous devez définir l'attribut useUnsafeHeaderParsing dans votre fichier web.config ou app.config. Si vous voulez vraiment changer la valeur de manière dynamique au moment de l'exécution, vous devrez alors recourir à la réflexion car la valeur est enterrée dans une instance de System.Net.Configuration.SettingsSectionInternal
et n'est pas accessible au public.
Voici un exemple de code (basé sur l'info trouvée ici ) qui fait l'affaire:
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;
}
}
}
Si vous ne voulez pas utiliser Reflection, vous pouvez essayer ce code (référence 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");