バイナリのアップロードを受け入れるセルフホステッド .NET サービスを作成しました。
[ServiceContract]
public interface IBinaryService
{
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "up/file/{fileName}/{hash}")]
void FileUpload(string fileName, string hash, Stream fileStream);
ファイルを受信すると、まずそのファイルがすでにシステム上にあるかどうかを確認します。そうでない場合は、クライアントからファイルをストリーミングして保存します。
public void FileUpload(string fileName, string hash, Stream fileStream)
{
string filebasedir = basedir + @"file\"; //"
if (File.Exists(filebasedir + hash))
{
WebOperationContext.Current.OutgoingResponse.StatusCode =
System.Net.HttpStatusCode.Conflict;
return;
}
using(var fileToupload = new FileStream(
string.Concat(filebasedir, hash),
FileMode.Create))
{
fileStream.CopyTo(fileToupload);
}
コードをステップ実行すると、サーバーがパラメーターを読み取り、競合があるかどうかを判断するまで、ファイルの内容がストリーミングされないことがわかります。サーバーが完全なコンテンツ (数メガバイトになる可能性があります) を読み取らないようにする必要があります。残念ながら、「return」を使用してメソッドを早期に終了しても、これは行われません。
これは可能ですか?