今天在HttpWebRequest发送一个网页请求的时候,HttpWebResponse返回了一个奇怪的错误信息:html
这个Http协议请求类但是微软封装的,我使用的流程但是中规中矩,不多是我写错代码,然而看了下抓包工具抓的包,返回一切正常,因此只有一种可能就是对方服务器返回的标头格式不符合微软的解析规则。 所以脑壳里第一个想到的就是用Socket重写HttpWebResponse,但是想了下,HttpWebResponse自己封装的已经不错了,若是再去重写还不必定会比微软写的好,何况由于这一个小小的问题就从新去造一个很是复杂精细的轮子,旷日持久不说,水平和质量也使人怀疑。因而乎上网找了下对策。服务器
网上大部分都是在app.Config配置里设置useUnsafeHeaderParsing:app
<?xml version="1.0"?> <configuration> <system.net> <settings> <httpWebRequest useUnsafeHeaderParsing="true" /> </settings> </system.net> </configuration>
这个方法证实可行,可是想了下,不少朋友都很不喜欢一个小小的程序由于这个事带上个配置文件,总感受内心毛毛的。要是在程序里解决多好。因而乎又花了点时间,在一个国外的论坛里找到了解决方案,用了反射,直接操做System.Net.Configuration.SettingsSectionInternal类下的私有字段。虽然反射会带来性能上的影响,可是这里貌似没有更好的办法,由于不能操做一个封装好的私有变量。ide
public static bool SetAllowUnsafeHeaderParsing20(bool useUnsafe) { //Get the assembly that contains the internal class System.Reflection.Assembly aNetAssembly = System.Reflection.Assembly.GetAssembly(typeof(System.Net.Configuration.SettingsSection)); if (aNetAssembly != null) { //Use the assembly in order to get the internal type for the internal class Type aSettingsType = aNetAssembly.GetType("System.Net.Configuration.SettingsSectionInternal"); if (aSettingsType != null) { //Use the internal static property to get an instance of the internal settings class. //If the static instance isn't created allready the property will create it for us. object anInstance = aSettingsType.InvokeMember("Section", System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.GetProperty | System.Reflection.BindingFlags.NonPublic, null, null, new object[] { }); if (anInstance != null) { //Locate the private bool field that tells the framework is unsafe header parsing should be allowed or not System.Reflection.FieldInfo aUseUnsafeHeaderParsing = aSettingsType.GetField("useUnsafeHeaderParsing", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); if (aUseUnsafeHeaderParsing != null) { aUseUnsafeHeaderParsing.SetValue(anInstance, useUnsafe); return true; } } } } return false; }
这个方法必定要在HttpWebRequest开始响应以前设置,不然会没有任何效果。工具