2013-10-15 60 views
2

我在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內部服務器錯誤

回答

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,創建一個名爲app.exe.config在同一個目錄中的exe文件,並把上面的內容進去。然後運行該應用程序,並創建一個日誌文件。

這個鏈接應該有更多獲取日誌文件的信息,以防萬一你有問題。

creating a system.net trace log

你可以把日誌文件上刪除引擎收錄像主機名的個人信息,ipaddresses等

而且後,給我們的代碼片段重現問題。那麼它會更容易幫助。

+0

代碼正在服務器上運行。這些是http獲取對資源的調用。事實證明,該帳戶委派並未打開,因此通過將NTLM放在Kerberos之上的IIS屬性中,這些調用以及身份驗證都可以通過。 – spojam