2012-01-26 5 views
1

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; 
} 
+0

私たちにいくつかのコードを見せてください。 '私はリクエストヘッダーをチェックする 'これはどこで行うのですか?ストリームをどこで読んでいますか? – Aliostad

+0

@Aliostad、抜粋を掲載しました。 – kpozin

+0

良い。ありがとう.... – Aliostad

答えて

0

HttpWebRequestと、一般的にHTTPリクエストの下にあるストリーミングをサポートしていません。サーバー側の概念であるチャンクエンコードによって実装されています。

私は関連しているあまりにもこの質問に答え: IIS7 refuses chunked-encoded file upload

あなたはストリームを要求するために書いているときに送信されるまで、それはContent-Lengthヘッダを蛹化しているので、それがローカルにバッファリングされています。フィドラーでこれを確認できます。

+0

私は実際にクライアントが何をしているのか心配していません(この場合は、リクエストストリームに書き込む前にクライアント側のContent-Lengthヘッダを手動で設定しています)。私はちょうど*サーバ*が要求を受け取ることを中止することができるようにしたい*。これは技術的に可能であることがわかっています。なぜなら、WCFは構成された最大メッセージサイズを超えた要求を切断できるからです。私の操作でリクエストに関する何かが気に入らないときは、自分のサーバーコードの中からこれをやりたいと思います。 – kpozin

1

おそらく、リクエストの本文とコンテキストを傍受できるメッセージインスペクタコンポーネントを記述することができます。

メッセージ/コンテキストを検査した後、例外をスローすることができます(必要な場合)。

HTH

関連する問題