WCF RESTサービスは、ストリーミング(バッファなし)モードで実行されており、HTTP要求の本文に生のバイトとしてファイルをアップロードしています。着信ストリーム(MessageBodyStream
)を読む前に、私はリクエストヘッダーをチェックし、Content-Length
がその特定の操作に適したサイズであることを確認します。WCF RESTの着信要求を読み取る中断割り込み
Content-Length
が許容サイズより大きい場合は、残りのリクエストが転送されるのを待たずにエラー応答をすぐに返したい(WebFaultException
を投げて)。
ただし、例外がスローされた後でも、WCFがストリームを最後まで読み取ろうとしているようです。クライアントが50 MBファイルを送信している場合、応答が送信される前に50 MBがすべて転送されます。
これを回避し、HTTPリクエストの受信を中断する方法はありますか?
関連質問:Why is WCF reading input stream to EOF on Close()?
EDIT:追加のコードの抜粋
OperationContract
とアップロードヘルパーメソッド:
[OperationContract]
[WebInvoke(UriTemplate = /* ... */, Method = "POST",
ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)]
public void UploadMyFile(string guid, Stream fileStream)
{
string targetPath = /* targetPath */;
UploadFile(fileStream, targetPath, /* targetFileName */);
}
private bool UploadFile(Stream stream, string targetDirectory,
string targetFileName = null, int maximumSize = 1024 * 500,
Func<string, bool> tempFileValidator = null)
{
int size = 0;
int.TryParse(IncomingRequest.Headers[HttpRequestHeader.ContentLength], out size);
if (size == 0)
{
ThrowJsonException(HttpStatusCode.LengthRequired, "Valid Content-Length required");
}
else if (size > maximumSize)
{
ThrowJsonException(HttpStatusCode.RequestEntityTooLarge, "File is too big");
}
if (!FileSystem.SaveFileFromStream(stream, targetDirectory, targetFileName, tempFileValidator))
{
ThrowJsonException(HttpStatusCode.InternalServerError, "Saving file failed");
}
return true;
}
私たちにいくつかのコードを見せてください。 '私はリクエストヘッダーをチェックする 'これはどこで行うのですか?ストリームをどこで読んでいますか? – Aliostad
@Aliostad、抜粋を掲載しました。 – kpozin
良い。ありがとう.... – Aliostad