問題の背景。
編集 3 これが Chrome 20 で再び機能しているように見えることを確認できます。ありがとう!
TLDR アップデート
EDIT 2 これについてさらにいじった後、Chrome 19のバグのようです。こちらをご覧ください:
最小のバグのようなものはありません! :-)
最新の Firefox と IE8/9 は期待どおりに動作します。Fiddler のログは同じ動作を示していますが、2 回目の 401 認証チェックでフォーム ペイロードが文字化けして送信されず、期待どおりに動作するという大きな違いがあります。
これはテスト ケースのように思えますが、現在修正中です。ですから、うまくいけば、これに遭遇した可能性のある人にとって、これが役立ちます!
エンド TLDR
「イベント」のCSVファイルであるアップロードされたファイルのみを取り込むコントローラーアクションがあります。バックグラウンドで、この CSV が解析されて Event オブジェクトに変換され、データがデータベースに同期されます。結果出力として、ユーザーは、発生した各行のすべてのエラーを含む Excel スプレッドシートをダウンロードするように求められます。
これはすべて、私の開発マシンでローカルに正常に動作します。ただし、DEV 環境にデプロイすると、異なる結果が得られます。ファイルを最初にアップロードしようとすると、ストリームが「What's the word that I'm looking for here, unreadable?」 になります。その長さは正しく報告されますが、情報を引き出そうとしても何も得られません。後続の読み取りにはデータがあり、すべてが期待どおりに機能します。
関連するコード写真を提供します。まず、生成された HTML フォームを簡略化します。
<form action="/Events/ImportLocal" enctype="multipart/form-data" method="post">
<input id="uploadFile" name="uploadFile" type="file" />
<input type="submit" value="Upload Events" />
</form>
かなり簡単です:
コントローラーのアクション (混乱を許してください。私はこれを数時間ハッキングしてきました):
[HttpPost]
public ActionResult ImportLocal(HttpPostedFileBase uploadFile)
{
if (uploadFile == null || uploadFile.ContentLength <= 0)
{
BaseLogger.Info("uploadFile is null or content length is zero...");
//Error content returned to user
}
BaseLogger.InfoFormat("Community Import File Information: Content Length: {0}, Content Type: {1}, File Name: {2}",
uploadFile.ContentLength, uploadFile.ContentType, uploadFile.FileName);
//This logger line is always reporting as correct. Even on the attempts where I can't pull out the stream data, I'm seeing valid values here.
//EXAMPLE output on failed attempts:
//Import File Information: Content Length: 315293, Content Type: application/vnd.ms-excel, File Name: Export_4-30-2012.csv
BaseLogger.InfoFormat("Upload File Input Stream Length: {0}", uploadFile.InputStream.Length);
//This is reporting the correct length on failed attempts as well
//I know the below is overly complicated and convoluted but I'm at a loss for why the inputstream in HttpPostedFileBase is not pulling out as expected
//so I've been testing
var target = new MemoryStream();
uploadFile.InputStream.CopyTo(target);
byte[] data = target.ToArray();
BaseLogger.InfoFormat("File stream resulting length = {0}", data.Length);
//This reports correctly. So far so good.
StringReader stringOut;
var stream = new MemoryStream(data) {Position = 0};
using (var reader = new StreamReader(stream))
{
string output = reader.ReadToEnd();
BaseLogger.InfoFormat("Byte[] converted to string = {0}", output);
//No go...output is reported to be empty at this point so no data ever gets sent on to the service call below
stringOut = new StringReader(output);
}
//Build up a collection of CommunityEvent objects from the CSV file
ImportActionResult<Event> importActionResults = _eventImportServices.Import(stringOut);
目標は、サービス メソッドに textreader または stringreader を渡すことです。これは、これらの型を必要とする CSV 処理の実装を舞台裏で使用しているためです。
最初のリクエストが失敗したのに、その後の作業が失敗した理由はありますか? アイデアが枯渇しているので、新鮮な目が必要だと感じています。
最後の点として、IIS 7.5 は、IIS Express を介したローカルと宛先サーバーの両方のターゲットです。
ありがとう
賞金の編集:
ここに報奨金メッセージと各リクエストの Fiddler 出力をコピーしています
この質問にいくつかのコメントを追加しました。この問題は、NTLM に関連して発生します。Fiddler に表示されるのは、有効なフォーム データを含むリクエスト 1 の 401 Unauthorized です (ポイント、これらの最初の 2 つの 401 Unauthorized リクエストは、Windows 認証のみがオンになっているシナリオでは「正常」であることを理解しています。確認してください)。リストされているリクエスト 2 は、同じフォーム データを含む 401 です。ただし、アップロードされたファイル データは、正確にアップロードされたデータではなく、まったく同じサイズのデータであり、まったく同じサイズのボックスの集まりになっています。リクエスト 3 は、文字化けしたデータを含む 200 OK であり、これが私のコントローラー アクションが得ているものです。ファイルのアップロードで NTLM をうまく機能させるにはどうすればよいですか?
各リクエストの Fiddler 出力は次のとおりです。
リクエスト 1)
リクエスト 2)
そして最後に処理された HTTP 200 OK であるリクエスト 3
EDIT 2 これについてさらにいじった後、Chrome 19のバグのようです。こちらをご覧ください:
最小のバグのようなものはありません! :-)
最新の Firefox と IE8/9 は期待どおりに動作します。Fiddler のログは同じ動作を示していますが、2 回目の 401 認証チェックでフォーム ペイロードが文字化けして送信されず、期待どおりに動作するという大きな違いがあります。
これはテスト ケースのように思えますが、現在修正中です。ですから、うまくいけば、これに遭遇した可能性のある人にとって、これが役立ちます!
ありがとう