WCF: использование потоковой передачи с сообщением Контракты

Оператор является особым случаем выражения, один с 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.

20
задан Stefano Ricciardi 28 August 2009 в 10:50
поделиться

2 ответа

Наконец-то я выяснил, в чем была ошибка: она не имела ничего общего с версиями 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

8
ответ дан 30 November 2019 в 01:31
поделиться

Вам нужна потоковая передача (т.е. передача огромных объемов данных) как по запросу, так и по ответу? Или просто в ответе (обычно: загрузка файла или большого набора данных)?

Если вам нужен только ответ, вы должны попытаться установить режим передачи на «StreamedResponse»:

<customBinding>
    <binding name="customHttpBindingStream">
        <textMessageEncoding messageVersion="Soap12" />
        <httpTransport transferMode="StreamedResponse" 
                       maxReceivedMessageSize="2147483647"/>
    </binding>
</customBinding>

Параметр «Streamed» будет передавать поток в обе стороны - как запрос, идущий на сервер, так и ответ от сервера, будут передаваться в потоковом режиме. Чаще всего это не идеальный сценарий.

Марк

2
ответ дан 30 November 2019 в 01:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: