Как мне поддерживать потоковую передачу в WSFederationHttpBinding?

У меня есть служба wcf, которая используется для загрузки и скачивания больших файлов на сервер. Я использую кодировку сообщений MTOM и хочу использовать режим потоковой передачи. Но мы используем wsFederationHttpBinding. Как мне поддерживать потоковую передачу в wsFederationHttpBinding?

Мой код web.config службы WCF приведен ниже,

<wsFederationHttpBinding>
 <binding  name="UploadserviceFederation"
                      messageEncoding="Mtom"
                  maxBufferPoolSize="2147483647"
                  maxReceivedMessageSize="2147483647" >
          <readerQuotas maxStringContentLength="2147483647"
                      maxDepth="2147483647"
                      maxBytesPerRead="2147483647"
                      maxArrayLength="2147483647"/>

          <security mode="TransportWithMessageCredential">
            <!-- Ping token type MUST be SAML 1.1, do not change -->
            <message 
              issuedTokenType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.1#SAMLV1.1" negotiateServiceCredential="false">
              <!-- TODO: You must put the proper issuer URN of the Ping STS; normally this would be the Ping base URL -->
              <issuer address="https://my-issuer.com" binding="customBinding" bindingConfiguration="FileUploadSTSBinding" />
            </message>
          </security>
        </binding>

      </wsFederationHttpBinding>


<customBinding>
        <binding name="FileUploadSTSBinding">
          <security authenticationMode="UserNameOverTransport" requireDerivedKeys="false"
              keyEntropyMode="ServerEntropy" requireSecurityContextCancellation="false"
              requireSignatureConfirmation="false">
          </security>
          <httpsTransport maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" />
        </binding>
</customBinding>

person blue    schedule 05.04.2012    source источник


Ответы (2)


Прошло несколько лет, поэтому я не знаю, помогает ли это по-прежнему, но я наткнулся на этот пост, пытаясь выяснить ту же проблему, поэтому он может кому-то помочь.

Оказывается, на самом деле это довольно просто ... как только вы научитесь танцевать правильно.

Вероятно, самый простой способ (и то, что я пробовал в первую очередь) - это унаследовать от WS2007FederationHttpBinding. Как оказалось, у него есть виртуальный метод GetTransport, поэтому вы можете переопределить его и вернуть экземпляр HttpsTransport с параметром TransferMode, установленным на Streamed:

public class FileUploadSTSBinding : WS2007FederationHttpBinding
{
    protected override TransportBindingElement GetTransport()
    {
        return new HttpsTransportBindingElement()
        {
            TransferMode = TransferMode.Streamed
        };
    }
}

Однако это показало кое-что еще: поскольку моя привязка больше не была признанным типом привязки, svcutil больше не рассматривал ее как привязку WS2007FederationHttpBinding, а скорее как настраиваемую привязку, что привело к созданию конфигурации на стороне клиента в виде стека. элементов привязки вместо использования ярлыков, предоставляемых привязкой федерации:

    <customBinding>
                <binding name="CustomBinding_ISdk">
                    <security defaultAlgorithmSuite="Default" authenticationMode="IssuedTokenOverTransport"
                        requireDerivedKeys="true" includeTimestamp="true" messageSecurityVersion="WSSecurity11WSTrust13WSSecureConversation13WSSecurityPolicy12BasicSecurityProfile10">
                        <issuedTokenParameters keyType="BearerKey">
                            <additionalRequestParameters>
                                <trust:SecondaryParameters xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
                                    <trust:KeyType xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer</trust:KeyType>
                                </trust:SecondaryParameters>
                            </additionalRequestParameters>
                        </issuedTokenParameters>
                        <localClientSettings detectReplays="false" />
                        <localServiceSettings detectReplays="false" />
                    </security>
                    <textMessageEncoding />
                    <httpsTransport />
                </binding>

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

Надеюсь, это поможет.

person William Scalf    schedule 29.09.2015
comment
Я не знаю, упустил ли я что-то, но как применить остальную конфигурацию к FileUploadSTSBinding? Я знаю, что это старое ... но я нахожусь в том же месте! - person kenam; 21.07.2016
comment
Я не уверен, что понимаю ваш вопрос. Если вы используете подход из первого поля, все настройки, к которым у вас обычно есть доступ в файле конфигурации, должны быть доступны как свойства. Если вы используете подход, описанный во втором поле, у вас должен быть доступ ко всему, что вы обычно делаете, а затем и к некоторым. Имена свойств будут разными (поскольку вы имеете дело непосредственно с элементами привязки, а не с причудливым, удобным стандартным типом привязки), но все и многое другое должно быть там, и вы должны получить intellisense в Visual Studio. Вы ищете что-то конкретное? - person William Scalf; 23.07.2016
comment
ок .. Было поздно и я запуталась! Теперь я вижу, что все свойства доступны для подкласса WS2007FederationHttpBinding. Я добавил ко всему этому код и подключил его к ServiceHostFactory, и это выглядит примерно правильно. Однако, когда я ссылаюсь на эту службу из другого проекта или SVCUtil, я вижу, что она (досадно) правильно идентифицирует ее как 'ws2007FederationHttpBinding', а не как настраиваемую привязку. Это вернуло меня к началу, поскольку я не могу понять, как указать параметр Stream (в этом случае политика Co ищет конфигурацию). - person kenam; 25.07.2016
comment
в порядке. теперь вижу - либо все программно, либо весь конфиг. Я подумал, что могу применить подход №1, описанный выше (подкласс), а затем применить конфигурацию из xml WS2007FederationHttpBinding. Поскольку нам нужно использовать конфигурацию xml, я перестраиваю полную привязку как настраиваемую привязку. Имеет смысл, если вы отступите на секунду и RTFM :) - person kenam; 26.07.2016
comment
Я сам скоро пойду по этой дороге. Возникает вопрос: почему это не включено по умолчанию? - person 9Rune5; 17.06.2019

Вам нужно будет включить режим потоковой передачи в настраиваемой привязке, поскольку только привязки BasicHttpBinding, NetTcpBinding и NetNamedPipeBinding предоставляют свойство TransferMode. См. Пример в этой статье.

person Bernard    schedule 05.04.2012
comment
Значит, я не смогу использовать wsFederationHttpBinding и режим потоковой передачи, верно? - person blue; 05.04.2012
comment
Нет, но вы можете создать настраиваемую привязку, которая имитирует то, что делает привязка WsFederationHttpBinding, просто делайте это осторожно. - person Bernard; 05.04.2012
comment
У вас есть пример настраиваемой привязки, которая имитирует WsFederationHttpBinding? - person blue; 05.04.2012
comment
К сожалению, нет. Привязка WsFederationHttpBinding очень похожа на привязку WsHttpBinding. Почему именно вам нужно использовать привязку WsFederationHttpBinding? - person Bernard; 05.04.2012
comment
Мы используем аутентификацию на основе токенов, у нас есть централизованная аутентификация для аутентификации различных приложений. - person blue; 06.04.2012