集合已包含方案 net.tcp 的地址
Collection Already Contains Address with scheme net.tcp
我有一个长期存在的问题,我已经研究了几天了。我正在研究 t运行sitioning 一个 WCF 服务以使用动态端口,这个需求终于出现了。我大部分时间都在那里;但是,我收到错误消息:
System.ArgumentException: This collection already contains an address with scheme 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);
}
我有一个长期存在的问题,我已经研究了几天了。我正在研究 t运行sitioning 一个 WCF 服务以使用动态端口,这个需求终于出现了。我大部分时间都在那里;但是,我收到错误消息:
System.ArgumentException: This collection already contains an address with scheme 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);
}