【问题标题】:HttpWebRequest "keep-alive" header gets droppedHttpWebRequest“keep-alive”标头被丢弃
【发布时间】:2013-10-15 17:58:45
【问题描述】:

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

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

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

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

我在 Fiddler 中看到,在 NTLM 握手期间正确满足了类型 1、2 和 3 挑战,但是,最终响应是 500 内部服务错误。响应文本还表明 rsStreamNotFound,但是,我几乎没有发现任何关于这意味着什么的信息,我认为这会误导真正的问题可能是什么。

当我使用 Firefox 时,Firefox 会提示我为报告输入我的网络凭据,然后再次提示我输入图像,然后将图像返回。我的 HttpWebRequest 失败,出现 500 Internal Server Error 和 rsStreamNotFound。

我可以在 Firefox 请求和我的请求之间的请求标头中看到的唯一区别是“keep-alive”属性从我的编程请求中删除,而 Firefox 请求将它包含在其中。

为什么我的“keep-alive”会掉线?

在这一点上,这是我的请求和来自 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 Internal Server Error

【问题讨论】:

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


    【解决方案1】:

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

    无论如何,我建议使用 .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

    您可以在删除主机名,IP地址等个人信息后将日志文件放在pastebin上。

    另外,给我们一个重现问题的代码。这样就更容易提供帮助了。

    【讨论】:

    • 代码正在服务器上运行。这些是对资源的 http get 调用。原来是帐户委派没有打开,所以通过将 NTLM 放在 IIS 中的属性内的 Kerberos 之上,调用和身份验证都通过了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-19
    • 2012-09-15
    • 1970-01-01
    • 2011-09-14
    • 2016-09-07
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多