【问题标题】:One endpoint, different bindings?一个端点,不同的绑定?
【发布时间】:2009-12-14 21:54:00
【问题描述】:

有没有办法从单个端点公开服务,例如“https://mydomain.com/Myservice.svc” 但能够有不同的绑定配置。

我知道一个端点在 URL + Contract + Binding 上必须是唯一的,但我想知道如何拥有多个绑定 无需为我想要支持的每个绑定处理所有 .svc 文件(因为 IIS 中的 URL 是文件夹或虚拟目录)

例如,我想要有加密的Http,没有加密的Http..如果以后我不想建立securityContext,那么我必须复制4次我的svc文件来支持

一个与: 建立SecuriTyContext = true 加密 = 真

一个与: 建立SecuriTyContext = true 加密=假

一个与: 建立SecuriTyContext = true 加密 = 真

一个与: 建立SecuriTyContext = false 加密=假

等等……

这对我来说没有意义。

【问题讨论】:

    标签: wcf


    【解决方案1】:

    为每个端点引用一个唯一的绑定配置。此示例展示了如何使用 NetNamedPipeBinding 来完成此操作,但您也可以将此概念扩展到其他绑定。

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <system.serviceModel>
            <bindings>
                <netNamedPipeBinding>
                    <binding name="default1" closeTimeout="00:01:00" openTimeout="00:01:00"
                        receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
                        transferMode="Buffered" transactionProtocol="OleTransactions"
                        hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"
                        maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536">
                        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                        <security mode="Transport">
                            <transport protectionLevel="EncryptAndSign" />
                        </security>
                    </binding>
                    <binding name="default2" closeTimeout="00:01:00" openTimeout="00:01:00"
                        receiveTimeout="infinite" sendTimeout="00:01:00" transactionFlow="false"
                        transferMode="Buffered" transactionProtocol="OleTransactions"
                        hostNameComparisonMode="StrongWildcard" maxBufferPoolSize="524288"
                        maxBufferSize="65536" maxConnections="10" maxReceivedMessageSize="65536">
                        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                        <security mode="Transport">
                            <transport protectionLevel="EncryptAndSign" />
                        </security>
                    </binding>
                </netNamedPipeBinding>
            </bindings>
            <services>
                <service name="MyService">
                    <endpoint name="MyService1"
                        address="net.pipe://localhost/MyService1"
                        contract="NSITE.Services.Event.IMyService"
                        binding="netNamedPipeBinding" bindingConfiguration="default1" />
                    <endpoint name="MyService2"
                        address="net.pipe://localhost/MyService2"
                        contract="NSITE.Services.Event.IMyService"
                        binding="netNamedPipeBinding" bindingConfiguration="default2" />
                </service>
            </services>
        </system.serviceModel>
    </configuration>
    

    【讨论】:

    • 嗨,马特,我对 NamedPipeBinding 不是很熟悉... 你有 .svc 文件吗?基本上,我想这样做,但在 IIS 托管的 HTTP/HTTPS binidngs 中,服务的起点是 .svc 文件。在您的示例中,在端点地址中,/MyService1 和 /MyService2 将是 IIS 中的两个目录。但我不想复制 .svc 文件的次数,因为我有不同的绑定。由于我的 Web 项目是预编译的,我不能只创建两个 IIS 虚拟目录,因为预编译的 Web 项目与其 IIS 应用程序紧密绑定。有什么想法吗?
    • @Sebastien,每个端点的地址/绑定/合同元组必须是唯一的。如果合约相同且绑定相同,则地址必须更改以使元组唯一。我不在 IIS 中工作,但如果 .svc 文件的地址映射到一个目录,听起来你必须有多个目录。我希望对 IIS 有更多了解的人可以帮助您。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多