具有2个绑定和2个基址的WCF服务

时间:2010-05-12 20:52:19

标签: .net wcf

我已经编写了一个WCF服务(我是一个新手),我想为(net.tcp& basicHttp)提供2个端点。当我尝试配置端点时出现问题。如果我将它们配置为单独的服务,那么我的服务名称是相同的,这会导致问题。我已经看到建议创建填充程序类(classA:MyService和ClassB:MyService),但这看起来很臭。

        <services>
        <service name="MyWcfService.MyService"
                         behaviorConfiguration="MyWcfService.HttpBehavior">
            <endpoint name="ApplicationHttp"
                                address="Application"
                                binding="basicHttpBinding"
                                bindingConfiguration="HttpBinding"
                                contract="MyWcfService.Interfaces.IMyService" />
            <endpoint address="mex"
                                binding="mexHttpBinding"
                                contract="IMetadataExchange" />
            <host>
                <baseAddresses>
                    <add baseAddress="http://localhost:8731/MyWcfService/" />
                </baseAddresses>
            </host>
        </service>
        <service name="MyWcfService.MyService"
                         behaviorConfiguration="MyWcfService.MyBehavior">
            <endpoint name="Application"
                                address="Application"
                                binding="netTcpBinding"
                                bindingConfiguration="SecuredByWindows"
                                contract="EmsHistorianService.Interfaces.IApplicationHistorianService" />
            <endpoint address="mex"
                                binding="mexTcpBinding"
                                contract="IMetadataExchange" />
            <host>
                <baseAddresses>
                    <add baseAddress="net.tcp://localhost:49153/MyWcfService" />
                </baseAddresses>
            </host>
        </service>
    </services>

我尝试使用单个服务,并将基地址集成到地址中,但这也给我带来了错误

        <services>
        <service name="MyWcfService.MyService"
                         behaviorConfiguration="MyWcfService.HttpBehavior">
            <endpoint name="ApplicationHttp"
                                address="http://localhost:8731/MyWcfService/Application"
                                binding="basicHttpBinding"
                                bindingConfiguration="HttpBinding"
                                contract="MyWcfService.Interfaces.IMyService" />
            <endpoint address="http://localhost:8731/MyWcfService/mex"
                                binding="mexHttpBinding"
                                contract="IMetadataExchange" />
            <endpoint name="Application"
                                address="net.tcp://localhost:49153/MyWcfService/Application"
                                binding="netTcpBinding"
                                bindingConfiguration="SecuredByWindows"
                                contract="EmsHistorianService.Interfaces.IApplicationHistorianService" />
            <endpoint address="net.tcp://localhost:49153/MyWcfService/mex"
                                binding="mexTcpBinding"
                                contract="IMetadataExchange" />
        </service>
    </services>

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

如果您有一项服务(我认为您的意思是一份服务合同),并且您希望公开两个端点,那么您的选项#2应该是要使用的选项。

但是,我确实发现您的配置存在一些问题:

<service name="MyWcfService.MyService"
         behaviorConfiguration="MyWcfService.HttpBehavior">

“MyWcfService.HttpBehavior”包括什么?任何可能导致net.Tcp端点出现问题的事情

<endpoint name="ApplicationHttp"
          address="http://localhost:8731/MyWcfService/Application"
          binding="basicHttpBinding"
          bindingConfiguration="HttpBinding"
          contract="MyWcfService.Interfaces.IMyService" />

<endpoint name="Application"
          address="net.tcp://localhost:49153/MyWcfService/Application"
          binding="netTcpBinding"
          bindingConfiguration="SecuredByWindows"
          contract="EmsHistorianService.Interfaces.IApplicationHistorianService" />

如果您有一个服务 - 一个服务合同 - 那么两个应用程序端点的contract=属性必须相同。

它是第一个(contract="MyWcfService.Interfaces.IMyService")或第二个(contract="EmsHistorianService.Interfaces.IApplicationHistorianService") - 我无法知道 - 但对于两个<endpoint>条目它应该是相同的,当然。 / p>

<强>更新
@Sean:你可能误解了MEX机制:tcpMexBinding将只显示netTcp绑定 - 这完全是设计和预期的。 MEX绑定是一种机制,因此您可以获取有关服务及其所有端点的元数据。当然,两个MEX端点都将显示所有应用程序端点 - 这是它们的终身目标。 MEX端点为查询客户端提供有关服务的(完整和未过滤的)元数据。然后由客户决定他能够和想要联系到哪个端点。