如何在Visual Studio 2013 WebTestRequest上设置Expect100Continue为fal
本文关键字:设置 Expect100Continue fal WebTestRequest 2013 Visual Studio | 更新日期: 2023-09-27 18:12:51
我目前有一个问题,当试图击中一个外部服务,webtest抛出以下异常:
'请求失败:服务器违反协议。Section=ResponseHeader Detail=CR后面必须跟LF'
对这个问题的调查使我写了一篇很好的文章,描述了这个异常的潜在原因。
http://mehdi.me/a-tale-of-debugging-the-linkedin-api-net-and-http-protocol-violations/取他的回购程序并添加request.ServicePoint。Expect100Continue = false;插入BuildWebRequest方法,并将其指向我们需要测试的外部服务,正如他指出的那样,结果确实成功了。
然而,编码的web测试不使用正常的WebRequest对象,而是使用WebTestRequest项目,该项目没有可设置的Expect100Continue字段,似乎也不尊重对servicepointmanager .Expect100Continue的任何更改。
我的问题是:如何在WebTestRequest对象类型上设置这个?有可能或者需要某种包装吗?
最后,我们找不到办法设置Expect100Continue标志,作为一个解决方案,不得不启用UnsafeHeaderFlag。
由于我们无法获得负载测试解决方案来使用http配置或应用配置,我们不得不使用反射来设置UnsafeHeader标志值。
public static bool SetAllowUnsafeHeaderParsing20(bool value)
{
//Get the assembly that contains the internal class
var aNetAssembly = Assembly.GetAssembly(typeof(System.Net.Configuration.SettingsSection));
if (aNetAssembly == null) return false;
//Use the assembly in order to get the internal type for the internal class
var aSettingsType = aNetAssembly.GetType("System.Net.Configuration.SettingsSectionInternal");
if (aSettingsType == null) return false;
//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.
var anInstance = aSettingsType.InvokeMember("Section",
BindingFlags.Static | BindingFlags.GetProperty | BindingFlags.NonPublic,
null,
null,
new object[] { });
if (anInstance == null) return false;
//Locate the private bool field that tells the framework is unsafe header parsing should be allowed or not
var aUseUnsafeHeaderParsing = aSettingsType.GetField("useUnsafeHeaderParsing", BindingFlags.NonPublic | BindingFlags.Instance);
if (aUseUnsafeHeaderParsing == null) return false;
aUseUnsafeHeaderParsing.SetValue(anInstance, value);
return true;
}
然后我们使用webtest插件来确保可以为给定的webtest设置。
public override void PreWebTest(object sender, PreWebTestEventArgs e)
{
UnsafeHeaderParsing.SetAllowUnsafeHeaderParsing20(UseUnsafeHeaderParsing);
}
这导致响应被解析而不引起异常。请注意,它确实掩盖了原始问题,但这只能通过服务器发送正确符合规范的信息来解决。