Прерывание чтения входящего запроса в WCF REST - PullRequest
1 голос
/ 26 января 2012

У меня есть служба 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;
}

Ответы [ 2 ]

1 голос
/ 27 января 2012

Вы, вероятно, можете написать компонент инспектора сообщений, который может перехватывать тело и контекст запроса.

Затем вы можете выбросить исключение (если хотите) после проверки сообщения / контекста.

HTH

0 голосов
/ 26 января 2012

HttpWebRequest и, как правило, HTTP-запрос не поддерживает потоковую передачу, которая реализуется посредством кодирования по частям, что является концепцией на стороне сервера.

Я только что ответил на этот вопрос, который связан с: IIS7 отклоняет загрузку фрагментированного файла

Когда вы пишете в поток запросов, он буферизуется локально до тех пор, пока не будет отправлен, так как ему нужно оцифровать заголовок длины содержимого. Вы можете проверить это в fiddler .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...