Оператор является особым случаем выражения, один с void
тип. Тенденция языков рассматривать операторы по-другому часто вызывает проблемы, и было бы лучше, если бы они были правильно обобщены.
, Например, в C# у нас есть очень полезное Func<T1, T2, T3, TResult>
перегруженная группа универсальных делегатов. Но у нас также должно быть соответствие Action<T1, T2, T3>
набор также, и программирование высшего порядка общего назначения постоянно должно дублироваться для контакта с этим неудачным раздвоением.
Тривиальный пример - функция, которая проверяет, является ли ссылка нулевой прежде, чем звонить на другую функцию:
TResult IfNotNull<TValue, TResult>(TValue value, Func<TValue, TResult> func)
where TValue : class
{
return (value == null) ? default(TValue) : func(value);
}
компилятор мог иметь дело с возможностью TResult
являющийся void
? Да. Все, что это должно сделать, требуют, чтобы возврат сопровождался выражением, которое имеет тип void
. Результат default(void)
имел бы тип void
, и func, передаваемый в, должен будет иметь форму Func<TValue, void>
(который был бы эквивалентен [1 110]).
Много других ответов подразумевают, что Вы не можете объединить операторы в цепочку как Вы, может с выражениями, но я не уверен, куда эта идея прибывает из. Мы можем думать ;
, который появляется после операторов как двоичный инфиксный оператор, беря два выражения типа void
и комбинируя их в отдельное выражение типа void
.
Наконец-то я выяснил, в чем была ошибка: она не имела ничего общего с версиями Soap , потоки и т. д. Я просто неправильно ввел название своей службы (!), используя FileTransfer
вместо FileTransferService
.
В конце концов, с basicHttpBinding все в порядке, мне не пришлось прибегать к настраиваемой привязке.
Исходная (плохая) версия:
<service
behaviorConfiguration="serviceBehavior"
name="Acme.Service.FileTransfer">
<endpoint address=""
name="basicHttpStream"
binding="basicHttpBinding"
bindingConfiguration="httpLargeMessageStream"
contract="Acme.Service.IFileTransferService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
Новая (исправленная) версия:
<service
behaviorConfiguration="serviceBehavior"
name="Acme.Service.FileTransferService">
<endpoint address=""
name="basicHttpStream"
binding="basicHttpBinding"
bindingConfiguration="httpLargeMessageStream"
contract="Acme.Service.IFileTransferService" />
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>
Тем не менее, я не могу сказать что сообщение об ошибке каким-либо образом помогло понять, что здесь происходит ....
Если вас интересует весь сервис, вы можете найти более подробную информацию в моем блоге по следующей ссылке: File Transfer с WCF
Вам нужна потоковая передача (т.е. передача огромных объемов данных) как по запросу, так и по ответу? Или просто в ответе (обычно: загрузка файла или большого набора данных)?
Если вам нужен только ответ, вы должны попытаться установить режим передачи на «StreamedResponse»:
<customBinding>
<binding name="customHttpBindingStream">
<textMessageEncoding messageVersion="Soap12" />
<httpTransport transferMode="StreamedResponse"
maxReceivedMessageSize="2147483647"/>
</binding>
</customBinding>
Параметр «Streamed» будет передавать поток в обе стороны - как запрос, идущий на сервер, так и ответ от сервера, будут передаваться в потоковом режиме. Чаще всего это не идеальный сценарий.
Марк