集合中已经包含方案为net.tcp的地址
本文关键字:net tcp 地址 方案 包含 集合 | 更新日期: 2023-09-27 18:02:53
我一直有一个问题,我已经研究了几天了。我正致力于将WCF服务转换为使用动态端口,这方面的需求终于出现了。我快到那儿了;然而,我得到错误:
系统。ArgumentException:这个集合已经包含了一个方案为net.tcp的地址。
我已经在网上搜索了一个答案,并且只找到了解决方案,如果方案是http。我将提供一些代码,以帮助那些希望帮助我和其他人解决这个问题的人。
我有一个services.development.config文件。由于组织内部的特定原因,我们将app.config文件分开了。
<service name="MLITS.Pulse.Pulse" behaviorConfiguration="PulseCSBehavior">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:14613/PulseService"/>
</baseAddresses>
</host>
<endpoint name="NetTcpEndPoint"
address=""
binding="netTcpBinding"
contract="MLITS.Pulse.IPulse" />
<endpoint name="NetTcpMetadataPoint"
address="mex"
binding="mexTcpBinding"
contract="IMetadataExchange" />
我们在client.development.config文件中也有端点地址。
<endpoint address="net.tcp://localhost:14613/PulseService" binding="netTcpBinding"
bindingConfiguration="NetTcpEndPoint" contract="PulseService.IPulse" name="NetTcpEndPoint" />
现在是我对我使用的方法的理解,我可以保留这里指定的具体端口号,以后再更改。现在,我更改端口号的方式是将会话id添加到基本端口号(即14613)。下面的代码就是这样做的方法。
public static void DynamicAddress()
{
int sessionIdentification = 0;
int portNumber = 0;
int newPort = 0;
string uriString = string.Empty;
sessionIdentification = Process.GetCurrentProcess().SessionId;
portNumber = 14613;
newPort = portNumber + sessionIdentification;
uriString = "net.tcp://localhost:" + newPort + "/PulseService";
//seperate the port from the rest of the service
//add the session id to the port
//put the address back together and return it
Uri uri = new Uri(uriString);
ServiceHost objServiceHost = new ServiceHost(typeof(Pulse), uri);
}
当我们尝试处理ServiceHost行时出现错误。我的问题是:我如何解决这个问题,使其正常工作?
请记住,我已经尝试注释掉services.development.config文件中的基址,以及client.development.config文件中的端点地址。当我这样做的时候,我遇到了其他的问题,因为我已经把地址注释掉了。
我已经解决了关于这个问题的问题。我没有尝试用另一个URI分配服务主机,而是必须首先清除端点,然后添加新的服务端点。我所做的唯一更改是DynamicPort方法。代码:
public static void DynamicAddress(
{
int sessionIdentification = 0;
int portNumber = 0;
int newPort = 0;
string uriString = string.Empty;
sessionIdentification = Process.GetCurrentProcess().SessionId;
portNumber = 14613;
newPort = portNumber + sessionIdentification;
uriString = "net.tcp://localhost:" + newPort + "/PulseService";
Uri uri = new Uri(uriString);
ServiceHost objServiceHost = new ServiceHost(typeof(Pulse));
objServiceHost.Description.Endpoints.Clear();
objServiceHost.AddServiceEndpoint(typeof(Pulse), new NetTcpBinding(), uri);
}