みんなおはよう、
IIS 7.5 でホストされているクラシック ASP を使用する Web アプリがあります。Word ドキュメントを作成し、クライアントにストリームして表示する必要がありますが、ドキュメントが応答にストリームされると、何か (IIS 設定?) が原因で 401 エラーが発生し、追跡できません。
同僚がとても親切に、ドキュメントの構築とストリーミングを処理する C++ コードと、COM オブジェクトを構築して呼び出しを行う ASP ページなどを提供してくれました。
ドキュメントは、ASP アプリケーションの外部にある IIS 仮想ディレクトリのテンプレートとして作成されます。コピーを作成し、いくつかの検索および置換アクションを実行してから、ブラウザが適切に処理できるように正しい MIME タイプで応答にストリーミングします。
ストリーミングが ( への呼び出しを介してASPTypeLibrary::IResponsePtr piResponse->BinaryWrite()
) 行われるとすぐに 401 応答が返されるように見えますが、その瞬間までは応答が正常に見えます。
サイトはフォーム認証を使用しており、この時点でサインインしています。フィドラーに表示されるリクエストには間違いなく有効なセッション データがあり、サイトの残りの部分は私の認証に満足しています。
何か案は?(彼は絶望的なメモで尋ねます)
psすべてのコードをリストしていないことに気づきましたが、それが役立つ場合はできます...
プロットが厚くなる...
ADODB.Stream
ASPページを使用して、オブジェクトを使用してファイルを出力にストリーミングすることに成功しました。
これが成功すると、Fiddler は 2 つの HTTP 要求/応答を取得します。最初のリクエストで 401 が返されると、ブラウザは別の Cookie データを含む別のリクエストを送信し、成功した結果を返します。
COM オブジェクトを使用すると、2 つの要求が発生しますが、2 番目の要求も 401 を受け取ります...
COMオブジェクトに関係するセキュリティ設定を指していますか? COMオブジェクトを使用して応答に追加していないものはありますか?
エリックへの私の回答によると、私の同僚はちょっとした魔法をかけて、うまくいきました。
Magic Al が変更した行は次のとおりです。
piResponse->AddHeader( _T("Content-Length"), (LPCTSTR)Length );
これは、応答が構築されている間に呼び出され、彼が行ったことはそれをコメントアウトすることでした.
BinaryWrite
どうやら、によって書き込まれた長さがファイルの長さよりも 13 バイト大きいことに気付いたようです。彼は、これは、指定された WORD ブロックから予約済みの WORD ブロックを書き出すことが原因である可能性があると私に言いましたVariant
。
したがって、応答ヘッダーは少し壊れており、その結果、私が見落としていたフィドラーの HTTP 違反エラーが発生し、クライアントと COM オブジェクトの間のどこかで壊れた 200 応答が 401 に置き換えられます。
この話の教訓は、フィドラーのエラーに常に注意を払い、自分Content-Length
が正しいことを確認する必要があるということだと思います。
私の新しい質問は、なぜ 401 なのかということです。なぜ500ではないのですか?そして、これを捨てている可能性が高いのは何ですか?それはIISから来ていますか?
これは、交換用の HTTP テキスト フィドラー レジスタです。
GET GET [The page address - its on localhost and is an ASP page] HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-GB
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Host: localhost
Cookie: SessionUID={E41F5378-FBE2-475E-8F9A-6416AFE2BAA0}; DisplayMethod=0; ShowDataTips=1; LOGONUSER={UserName Info}ASPSESSIONIDQARAQRBD={Session ID} Authorization: Negotiate YH8GBisGAQUFAqB1MHOgMDAuBgorBgEEAYI3AgIKBgkqhkiC9xIBAgIGCSqGSIb3EgECAgYKKwYBBAGCNwICHqI/BD1OVExNU1NQAAEAAACXsgjiCwALADIAAAAKAAoAKAAAAAYBsR0AAAAPRE9DREVWLUpDV0RFVkVMT1BNRU5U
HTTP/1.1 401 Unauthorized
Content-Type: text/html; charset=us-ascii
Server: Microsoft-HTTPAPI/2.0
WWW-Authenticate: Negotiate oYIBYTCCAV2gAwoBAaEMBgorBgEEAYI3AgIKooIBRgSCAUJOVExNU1NQAAIAAAAWABYAOAAAABXCieJQEtMwe36vajD3zwEAAAAA9AD0AE4AAAAGAbEdAAAAD0QARQBWAEUATABPAFAATQBFAE4AVAACABYARABFAFYARQBMAE8AUABNAEUATgBUAAEAFABEAE8AQwBEAEUAVgAtAEoAQwBXAAQAOABEAGUAdgBlAGwAbwBwAG0AZQBuAHQALgBEAG8AYwB1AG0AYQB0AGkAbwBuAC4AYwBvAC4AdQBrAAMATgBEAE8AQwBEAEUAVgAtAEoAQwBXAC4ARABlAHYAZQBsAG8AcABtAGUAbgB0AC4ARABvAGMAdQBtAGEAdABpAG8AbgAuAGMAbwAuAHUAawAFACAARABvAGMAdQBtAGEAdABpAG8AbgAuAGMAbwAuAHUAawAHAAgAKRk7jhfZzQEAAAAA
Date: Thu, 13 Dec 2012 09:52:25 GMT
Content-Length: 341
Proxy-Support: Session-Based-Authentication
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
<HTML><HEAD><TITLE>Not Authorized</TITLE>
<META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
<BODY><h2>Not Authorized</h2>
<hr><p>HTTP Error 401. The requested resource requires user authentication.</p>
</BODY></HTML>
------------------------------------------------------------------
GET [The page address - its on localhost and is an ASP page] HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-GB
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding: gzip, deflate
Connection: Keep-Alive
Cookie: SessionUID={E41F5378-FBE2-475E-8F9A-6416AFE2BAA0}; DisplayMethod=0; ShowDataTips=1; LOGONUSER={UserName Info}ASPSESSIONIDQARAQRBD={Session ID}
Authorization: Negotiate oXcwdaADCgEBoloEWE5UTE1TU1AAAwAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAAAAAAABYAAAAAAAAAFgAAAAAAAAAWAAAABXCiOIGAbEdAAAAD4GPyFfTAkcs1KpJqG4eT0ujEgQQAQAAAPUXp1AtIpqEAAAAAA==
Host: localhost
HTTP/1.1 401 Unauthorized
Cache-Control: private
Content-Type: text/html; charset=utf-8
Server: Microsoft-IIS/7.5
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
X-Powered-By: ASP.NET
Date: Thu, 13 Dec 2012 09:52:27 GMT
Content-Length: 6630
Proxy-Support: Session-Based-Authentication
<HTML Page telling you about the error which gets displayed when you cancel the authentication dialog.>