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[]
期待どおりにストリームが書き込まれていないことに少し驚いています。これは簡単なようです。