28

問題の背景。

編集 3 これが Chrome 20 で再び機能しているように見えることを確認できます。ありがとう!

TLDR アップデート

EDIT 2 これについてさらにいじった後、Chrome 19のバグのようです。こちらをご覧ください:

http://groups.google.com/a/chromium.org/group/chromium-bugs/browse_thread/thread/15bc4992bcd4be1d/b905e8de20ee58fa?lnk=raot

最小のバグのようなものはありません! :-)

最新の 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のバグのようです。こちらをご覧ください:

http://groups.google.com/a/chromium.org/group/chromium-bugs/browse_thread/thread/15bc4992bcd4be1d/b905e8de20ee58fa?lnk=raot

最小のバグのようなものはありません! :-)

最新の Firefox と IE8/9 は期待どおりに動作します。Fiddler のログは同じ動作を示していますが、2 回目の 401 認証チェックでフォーム ペイロードが文字化けして送信されず、期待どおりに動作するという大きな違いがあります。

これはテスト ケースのように思えますが、現在修正中です。ですから、うまくいけば、これに遭遇した可能性のある人にとって、これが役立ちます!

ありがとう

4

3 に答える 3

1

ファイルがアップロードされているIISフォルダー/仮想Webサイトのアクセス許可を確認し、それらが異なる場所にある場合はディレクトリ自体を確認する必要があると思います。

于 2012-05-23T10:06:13.940 に答える
1

良い質問。最初に頭に浮かんだのは認証でした。無許可で2つ取得し、3つ目で許可を取得するのが普通です。これがまさに NTLM の仕組みです。

Chrome でも動作させる必要があり、修正を待つことができない場合は、同じドメインにリダイレクトするフォーム認証を有効にすることをお勧めしますが、Windows 認証を使用した LOGIN アプリケーションが存在する別のポートにリダイレクトします。このアプリは、フォーム Cookie を設定するかどうかを設定し、メイン アプリに送り返します。このプロセスについては、http: //msdn.microsoft.com/en-us/library/ms972958.aspxで詳しく説明しています。

このように、NTLM が 1 回実行されると Cookie が作成されるため、NTLM は POST 要求では使用されず、すべてが期待どおりに機能するはずです。

これを共有しようと思っただけです:)

于 2012-07-02T09:51:56.350 に答える
1

これは試してみるだけのアイデアです。StreamReader には多くのコンストラクターがあることに注意してください。

http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx

一部のコンストラクターでは、エンコーディング (指定されている場合) を自動検出しようとし、検出できない場合は、指定されたエンコーディングにフォールバックします。使用されるコンストラクターは、UTF-8 エンコーディングを使用します。コンストラクターを変更してエンコーディングを自動検出し、そうでない場合は UTF-8 を使用できます。

于 2012-05-18T04:18:20.090 に答える