AdapterStream никогда не сбрасывается должным образом в службе WCF? - PullRequest
1 голос
/ 29 апреля 2011

Я написал приложение службы Windows, которое предоставляет веб-службу REST WCF. Подпись звонка выглядит следующим образом:

[OperationContract]
[WebInvoke(
    Method = "POST",
    UriTemplate = "/render",
    BodyStyle = WebMessageBodyStyle.Bare)]
Stream Render(Stream input);

Это реализовано так:

public Stream Render(Stream input)
{
    return new AdapterStream(output => DoActualWork(input, output));
}

Но сразу же, когда Render () возвращается, основной поток вызывающего клиента обрезается, так что он получает HTTP 200 OK и 0 байтов данных тела. Сразу после этого достигается точка останова внутри DoActualWork () - так что сервер фактически выполняет свою работу и в течение следующих секунд выдает данные на AdapterStream, но к тому времени вызывающая сторона была отключена и перестала работать.

Есть идеи, почему это происходит? Поскольку DoActualWork () фактически вызывается, может показаться, что фреймворк действительно пытался получить данные из AdapterStream, но ... ну, слишком поздно или что-то в этом роде.

Если ничего другого, есть ли у вас какие-либо другие предложения для достижения того же самого (то есть, обойти тот факт, что поток результатов является возвращаемым значением, а не параметром метода) без необходимости сначала выгружать (огромные) результаты в MemoryStream и вернуть это? Между прочим, это работает как оберег, за исключением большого количества памяти.

1 Ответ

1 голос
/ 28 октября 2011

Даже если этот вопрос довольно старый, я решил проблему следующим образом:

Сначала убедитесь, что ваш WebHttpBinding имеет потоковый режим TransferMode. Во-вторых, убедитесь, что вы очищаете и утилизируете поток, данный вам в обратном вызове. Третий блок обратного вызова (не метод Render!) До завершения записи в поток.

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