2

Web サーバーにハンドラーがあります。これを使用して、ハンドラーが置かれているサイトのアップロード ツールから画像をルーティングします。

フォームの送信アクションを使用してこれを行います。

<form id="fileupload" action="~/handlers/Upload.ashx" method="post" enctype="multipart/form-data">

ここで、このハンドラーを外部で使用するために公開する必要があります (アプリまたは私の Web サイトではない別のソースなどから)。

同じメソッドを使用する別のテスト プロジェクトを作成しようとしましたが、フォーム アクションのみがハンドラーへの URL です。

<form id="fileupload" action="http://mywebsite/handlers/Upload.ashx" method="post" enctype="multipart/form-data">

また、リクエストを手動で作成してストリームを渡そうとしました:

using (var stream = File.OpenRead(FILE_PATH))
{
     var httpRequest = WebRequest.Create(UPLOADER_URI) as HttpWebRequest;
     httpRequest.Method = "POST";
     stream.Seek(0, SeekOrigin.Begin);
     stream.CopyTo(httpRequest.GetRequestStream());

     var httpResponse = httpRequest.GetResponse();
     StreamReader reader = new StreamReader(httpResponse.GetResponseStream());
     var responseString = reader.ReadToEnd();

     //Check the responsestring and see if all is ok
 }

ハンドラーが格納されているサイトのフォームを使用する最初の方法は、期待どおりに機能しています。:)

そのメソッドを外部で使用しても、まったく応答がありません。

C#メソッドは、ユーザーを認証するポイントまでハンドラーをヒットしますが、その後、ファイルストリームが適切に渡されているとは思いません。ファイルのさまざまなプロパティをチェックするためのエラー処理がたくさんあります。応答はこれらのエラーを書き戻す必要がありますが、常に空です。

提案やご意見をいただければ幸いです。

ご協力ありがとうございました!

編集:

Web 構成でのハンドラーの登録は次のとおりです。

<add name="Upload" path="Upload.ashx" verb="*" type="mynamespace.Upload" resourceType="Unspecified" preCondition="integratedMode" />

編集:

C# の例でハンドラーがヒットしていることを確認するために、リモート デバッガーをセットアップしました。しかし、リクエストにはファイルがありません。stream.CopyTo() は、私が探している正しい呼び出しではないはずですか?

何かご意見は?

編集:

ファイルの受け渡し方法を少し変更しました。しかし、ハンドラーにヒットしても、request.Files は空です。変更されたコードは次のとおりです。

const string FILE_PATH = "C:\\image.jpg";
string UPLOADER_URI = string.Format("http://localhost//handlers/Upload.ashx");

using (var stream = File.OpenRead(FILE_PATH))
{
     var httpRequest = WebRequest.Create(UPLOADER_URI) as HttpWebRequest;
     httpRequest.Method = WebRequestMethods.Http.Post;
     httpRequest.AllowWriteStreamBuffering = true;
     httpRequest.ContentType = "binary/octet-stream";

     stream.Seek(0, SeekOrigin.Begin);

     byte[] bArray = new byte[stream.Length];

     stream.Read(bArray, 0, Convert.ToInt32(stream.Length));

     httpRequest.ContentLength = bArray.Length;

     Stream rStream = httpRequest.GetRequestStream();
     rStream.Write(bArray, 0, bArray.Length);
     rStream.Close();

     var httpResponse = httpRequest.GetResponse();
     StreamReader reader = new StreamReader(httpResponse.GetResponseStream());
     var responseString = reader.ReadToEnd();

     //Check the responsestring and see if all is ok
  }

そのため、ファイルを に変換してから、それをリクエスト ストリームにbyte[]書き込みます。byte[]期待どおりにストリームが書き込まれていないことに少し驚いています。これは簡単なようです。

4

1 に答える 1

0

最初に確認するのは、web.config のハンドラー登録構成です。たとえば、POST の受信のみが許可され、GET の受信は許可されない場合があります。ファイル アップロードのシナリオでは POST を使用しますが、説明している別のシナリオでは GET を使用しているように見えます。それがあなたの要求を無視している理由かもしれません。

HTH

于 2012-10-24T17:06:46.283 に答える