我有一個WCF REST服務運行在流(非緩衝)模式,它接收文件上傳爲HTTP請求正文中的原始字節。在閱讀傳入流(a MessageBodyStream
)之前,我檢查了請求標題,並確保Content-Length
適合該特定操作。中斷讀取傳入的請求在WCF REST
如果Content-Length
大於允許的大小,我希望立即返回一個錯誤響應(通過拋出一個WebFaultException
)而不用等待請求的其餘部分被傳輸。
但是,即使拋出異常,WCF似乎也試圖讀取流到最後 - 如果客戶端正在發送50 MB文件,則在發送響應之前將傳輸所有50 MB文件。
有什麼辦法可以避免這種情況,並中斷接收HTTP請求?
相關問題:Why is WCF reading input stream to EOF on Close()?
編輯:添加代碼摘錄
的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