C# 使用Http绑定时与WCF的Url注册问题
我正在尝试在一个应用程序中托管两个WCF服务。我希望他们共享相同的基本地址,但有自己的URL,比如:net。tcp://localhost:1234/service1和净值。tcp://localhost:1234/service2 以下配置允许我执行此操作: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
<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>