Я написал приложение службы 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 и вернуть это? Между прочим, это работает как оберег, за исключением большого количества памяти.