2

私はここで NTLM 地獄にいます。私が欠けているものを特定するのを手伝ってくれることを願っています。

私は最終的に SSRS レポートをブラウザーのフレームに配信しようとしていますが、レポート内の画像だけが私に多くの悲しみを与えています。ユーザーが Firefox を使用しており、資格情報を 2 回 (最初はレポート用に、次に 2 回目はレポート内の画像用に) 入力しない限り、それらは表示されません。

SSRS レポートを取得するために HttpWebRequest を使用しています。

HTMLストリームを受信した後、SSRSから画像を取得しようとするために、「NTLM」と有効な資格情報を含む資格情報キャッシュをWebサーバー(IIS 7.5)に送信して、それらをローカルに保存して参照できるようにします。これにより、ユーザーが軽減されます資格情報を何度も再入力する必要がなくなります。

Fiddler では、NTLM ハンドシェイク中にタイプ 1、2、および 3 の課題が適切に満たされていることがわかりますが、最終的な応答は 500 内部サービス エラーです。応答テキストには rsStreamNotFound も示されていますが、それが何を意味するのかについての情報はほとんどなく、実際の問題が何であるかについて誤解を招くと思います。

Firefox を使用すると、Firefox はレポート用のネットワーク資格情報を要求し、次に画像用に再度要求し、画像を元に戻します。HttpWebRequest が 500 Internal Server Error と 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 Unauthorized を取得したので、資格情報を試してみると 500 Internal Server Error が発生しました

4

1 に答える 1

0

あなたの質問から、コードを実行している場所が明確ではありません。デスクトップ上で実行可能ファイルとして実行されていますか? それとも、ある種の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 というファイルを作成し、上記の内容をその中に入れます。次にアプリを実行すると、ログファイルが作成されます。

問題が発生した場合に備えて、このリンクにはログファイルの取得に関する詳細情報が含まれているはずです。

system.net トレース ログの作成

ホスト名、IP アドレスなどの個人情報を削除した後、ログファイルをペーストビンに置くことができます。

また、問題を再現するコードのスニペットを提供してください。そうすれば、助けやすくなります。

于 2015-02-27T00:39:03.243 に答える