C# 使用Http绑定时与WCF的Url注册问题

C# 使用Http绑定时与WCF的Url注册问题,c#,.net,wcf,wcf-binding,C#,.net,Wcf,Wcf Binding,我正在尝试在一个应用程序中托管两个WCF服务。我希望他们共享相同的基本地址,但有自己的URL,比如:net。tcp://localhost:1234/service1和净值。tcp://localhost:1234/service2 以下配置允许我执行此操作: <system.serviceModel> <services> <service name="VanillaWcf.Shared.MyService" behaviorConfigu

我正在尝试在一个应用程序中托管两个WCF服务。我希望他们共享相同的基本地址,但有自己的URL,比如:net。tcp://localhost:1234/service1净值。tcp://localhost:1234/service2

以下配置允许我执行此操作:

<system.serviceModel>
    <services>
        <service name="VanillaWcf.Shared.MyService" behaviorConfiguration="beh">
            <endpoint address="myservice" binding="netTcpBinding" name="tcpEndPoint" contract="VanillaWcf.Shared.IMyService" />
            <endpoint address="myservice" binding="wsHttpBinding" name="httpEndPoint" contract="VanillaWcf.Shared.IMyService"/>
            <host>
                <baseAddresses>
                    <add baseAddress="net.tcp://localhost:1234" />
                </baseAddresses>
            </host>
        </service>
        <service name="VanillaWcf.Shared.SecondService" behaviorConfiguration="beh">
            <endpoint address="secondService" binding="netTcpBinding" name="tcpEndPoint" contract="VanillaWcf.Shared.ISecondService"/>
            <endpoint address="secondService" binding="wsHttpBinding" name="httpEndPoint" contract="VanillaWcf.Shared.ISecondService"/>
            <host>
                <baseAddresses>
                    <add baseAddress="net.tcp://localhost:1234"/>
                </baseAddresses>
            </host>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="beh">
                <serviceMetadata httpGetEnabled="false"/>
            </behavior>
        </serviceBehaviors>
    </behaviors>
</system.serviceModel>
这个很好用

但是,当我在配置中添加这两个服务的基址时,会出现一个异常

例外情况是: 在“”处具有约定“IHttpGetHelpPageAndMetadataContract”的ChannelDispatcher无法打开其IChannelListene 除了 已存在URI的注册

我没有任何MEX配置,我也不想要它


注意:我的NetPortSharing服务已禁用。

您不能有两个具有相同方案(net.tcp)和相同地址的基址-您必须更改某些内容

一种可能是不使用基址,而是在两个端点上完全指定net.tcp地址。这可能有效(应该有效,因为两个服务的整个地址不同)



Marc

端口共享是可能的,但您需要正确配置


请参见

通常,一次只能有一个应用程序监听tcp端口

对于net.tcp,MS已经做了一些允许端口共享的工作。见:


但这是特定于net.tcp绑定的。因此,当您尝试在同一端口上侦听http时,会遇到问题。

我找到了答案,但不知道为什么! 事实证明,当使用net.tcp时,相同的基址可以用于不同的服务地址,即net。tcp://localhost:1234 作为基址和/service1和/service2

但是,当使用http时,应在服务级别指定完整URL:即保留基址为空,并在服务级别使用和


这似乎与WCF非常强调的将协议与配置分离的整个想法大相径庭,但似乎是这样。

另一个问题是:您缺少任何地址(基址或显式端点地址)对于您的HTTP绑定…我在需要HTTP绑定时添加了它,而在需要HTTP绑定时问题才开始出现。如果你看一下配置,我有以下地址:net。tcp://localhost:1234/myservice 和网。tcp://localhost:1234/secondservice 它是有效的。问题是,当我将net.tcp更改为Http时,它为什么没有,我猜它与IHTTPGethelpPageandMetadataContract有关。我猜问题在于,在这两个相同的基址上都有Http Get metadata行为,所以当您导航到其中一个基址时,WCF应该如何知道您想要查看哪个服务的元数据?您需要使用两个独立的基址,或者将元数据端点更改为两个端点的独立内容(MEX端点的完整URL,不完全相同),我相信我可以在我的问题中看到。除非我完全知道它是如何工作的。@Khash:试着把它取下来看看-你能吗?请httpGetEnabled仅仅意味着无法使用HTTP检索元数据,但服务元数据仍使用MEX协议发布在该地址上。尝试从您的服务配置中删除behaviorCOnfiguration-只需查看。。。。
        ServiceHost host = new ServiceHost(typeof(MyService));
        ServiceHost secondHost = new ServiceHost(typeof(SecondService));

        host.Open();
        secondHost.Open();
<service name="VanillaWcf.Shared.MyService" behaviorConfiguration="beh">
   <endpoint name="tcpEndPoint" 
       address="net.tcp://localhost:1234/myservice1" 
       binding="netTcpBinding" 
       contract="VanillaWcf.Shared.IMyService" />
</service>