1

我有一个 wcf 服务,用于将大文件上传和下载到服务器。我正在使用 MTOM 消息编码,并且我想使用流传输模式。但是我们使用的是 wsFederationHttpBinding。如何在 wsFederationHttpBinding 中支持流式传输?

我的 WCF 服务 web.config 代码如下,

<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>
4

2 回答 2

3

已经有几年了,所以我不知道这是否仍然有帮助,但我在试图找出同样的问题时遇到了这篇文章,所以它可能会对某人有所帮助。

事实证明,它实际上非常简单......一旦你的舞蹈恰到好处。

可能最简单的事情(也是我首先尝试的)是从 WS2007FederationHttpBinding 继承。事实证明,它有一个虚拟的 GetTransport 方法,因此您可以覆盖它并返回一个将 TransferMode 设置为 Streamed 的 HttpsTransport 实例:

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>

..它显示了底层绑定元素实际上什么,这让你可以随心所欲地调整它们。而且,事实证明,它们与实际绑定并没有太大区别,因为唯一真正特殊的部分是安全元素,并且变化不大。

希望有帮助。

于 2015-09-29T14:32:30.510 回答
1

您必须在自定义绑定中启用流传输模式,因为只有BasicHttpBinding,NetTcpBindingNetNamedPipeBinding绑定公开该TransferMode属性。有关示例,请参见本文。

于 2012-04-05T18:53:54.707 回答