HttpWebRequest“keep-alive”标头被删除

时间:2013-10-15 17:58:46

标签: firefox reporting-services httpwebrequest ntlm keep-alive

我在NTLM地狱,希望你能帮助我找出我所缺少的东西。

我最终试图将SSRS报告发送到浏览器中的一个框架,只有报告中的图像让我感到非常悲伤。它们不会出现,除非用户使用Firefox并输入其凭据2次,首先输入报告,然后第二次输入报告中的图像。

我正在使用HttpWebRequest来获取SSRS报告。

我发送网络服务器(IIS 7.5)带有“NTLM”的凭证缓存和有效凭据,以便在我收到HTML流后尝试从SSRS获取图像,以便我可以在本地存储它们并参考那些减轻用户不得不一次又一次地重新输入凭证。

我在Fiddler看到在NTLM握手过程中正确地遇到了类型1,2和3的挑战,但最终响应是500内部服务错误。响应文本也表示rsStreamNotFound,但是,我发现旁边没有关于这意味着什么的信息,我认为它对于真正的问题可能会产生误导。

当我使用Firefox时,Firefox会提示我输入报告的网络凭据,然后再提示图像,然后重新启动图像。我的HttpWebRequest失败,出现500内部服务器错误和rsStreamNotFound。

我在Firefox请求和我的请求之间的请求标头中看到的唯一区别是,“keep-alive”属性从我的编程请求中被删除,并且Firefox请求将其放在那里。

为什么我的“保持活力”会被取消?

此时,这是我的请求与Firefox请求之间的唯一区别,因此我希望在跳转到任何其他结论之前消除这种差异。

我尝试了各种变体:

req.KeepAlive = true;
req.PreAuthenticate = true;

和这个宝石:

var sp = req.ServicePoint;
var prop = sp.GetType().GetProperty( "HttpBehaviour", BindingFlags.Instance | BindingFlags.NonPublic );
prop.SetValue( sp, (byte)0, null );

这是CredentialCache:

CredentialCache credentialCache = new CredentialCache();
credentialCache.Add( new Uri( path ), "NTLM", NetCredentials );

...并且我的HttpWebRequest请求中没有“keep-alive”,Firefox也有它 - 为什么我的掉线?

更新

我试过了:

using (WebClient client = new WebClient()) {
     client.DownloadFile(url, filePath);
}

...我得到401 Unauthorized,所以我尝试使用凭据并获得500内部服务器错误

1 个答案:

答案 0 :(得分:0)

从您的问题中不清楚您运行代码的位置。它作为可执行文件在桌面上运行吗?或者它是在firefox中运行的某种activex控件还是类似的东西?

无论如何,我建议使用.net tracelog工具获取事务日志,并查看日志文件。

<?xml version="1.0" encoding="UTF-8" ?>

    <configuration>
    <system.diagnostics>
    <trace autoflush="true" />

    <sources>
    <source name="System.Net">

    <listeners>
        <add name="System.Net"/>
    </listeners>
    </source>
    <source name="System.Net.Sockets">
    <listeners>
        <add name="System.Net"/>
    </listeners>
    </source>
    <source name="System.Net.Cache">
    <listeners>
        <add name="System.Net"/>
    </listeners>
    </source>
    </sources>
    <sharedListeners>
        <add
            name="System.Net"
            type="System.Diagnostics.TextWriterTraceListener"
            initializeData="System.Net.trace.log"
        />
    </sharedListeners>
    <switches>
        <add name="System.Net" value="Verbose" />
        <add name="System.Net.Sockets" value="Verbose" />               
        <add name="System.Net.Cache" value="Verbose" />
    </switches>
</system.diagnostics>
</configuration>

如果您的应用名称是app.exe,请在与exe相同的目录中创建名为app.exe.config的文件,并将上述内容放入其中。然后运行应用程序,并创建一个日志文件。

如果您遇到问题,此链接应该包含有关获取日志文件的更多信息。

creating a system.net trace log

删除个人信息(如主机名,ipaddresses等)后,您可以将日志文件放在pastebin上。

另外,请给我们一段代码来重现问题。然后它会更容易帮助。