【发布时间】: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