HttpWebRequest“keep-alive”头部被丢弃

问题描述:

我在NTLM地狱在这里,希望你能帮助识别我失踪的东西。HttpWebRequest“keep-alive”头部被丢弃

我最终试图将SSRS报告发送到浏览器中的一个框架,只有报告中的图像给我带来很大的悲伤。除非用户使用Firefox并输入凭证两次,第一次用于报告,第二次用于报告中的图像,否则不会显示。

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

我收到HTML流后,向Web服务器(IIS 7.5)发送带有“NTLM”和有效凭据的凭证缓存,尝试从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的请求中,并且Firefox有 - 它为什么会丢失?

更新:

我想:

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

...和我有401未授权,所以我试着用凭证,并获得500内部服务器错误

目前尚不清楚从你的问题你正在运行的代码。它是否作为可执行文件在桌面上运行?或者它运行在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,创建一个名为app.exe.config在同一个目录中的exe文件,并把上面的内容进去。然后运行该应用程序,并创建一个日志文件。

这个链接应该有更多获取日志文件的信息,以防万一你有问题。

creating a system.net trace log

你可以把日志文件上删除引擎收录像主机名的个人信息,ipaddresses等

而且后,给我们的代码片段重现问题。那么它会更容易帮助。

+0

代码正在服务器上运行。这些是http获取对资源的调用。事实证明,该帐户委派并未打开,因此通过将NTLM放在Kerberos之上的IIS属性中,这些调用以及身份验证都可以通过。 – spojam