如何在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对象类型上设置这个?有可能或者需要某种包装吗?

如何在Visual Studio 2013 WebTestRequest上设置Expect100Continue为fal

最后,我们找不到办法设置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);
    }

这导致响应被解析而不引起异常。请注意,它确实掩盖了原始问题,但这只能通过服务器发送正确符合规范的信息来解决。