У меня есть служба WCF REST, работающая в потоковом (небуферизованном) режиме, которая получает загрузку файла в виде необработанных байтов в теле HTTP-запроса. Перед чтением входящего потока (a MessageBodyStream
) я проверяю заголовки запроса и проверяю, что Content-Length
- правильный размер для этой конкретной операции.
Если Content-Length
больше разрешенного размера, я бы хотел немедленно вернуть ответ об ошибке (с помощью WebFaultException
), не дожидаясь передачи остальной части запроса.
Однако кажется, что WCF пытается прочитать поток до конца, даже после того, как сгенерировано исключение - если клиент отправляет файл размером 50 МБ, все 50 МБ будут переданы до отправки ответа.
Есть ли способ избежать этого и прервать получение HTTP-запроса?
Смежный вопрос: Почему WCF читает входной поток в EOF при 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;
}