配置和启动WCF服务时出现问题
本文关键字:问题 服务 启动 WCF 配置 | 更新日期: 2023-09-27 18:01:39
我在配置和启动WCF服务时遇到问题。在我的应用程序中有一个启动服务的方法。像这样
void Start(string protocol, string address, string port)
{
host = new ServiceHost(_myService,
new Uri(String.Format("{0}://{1}{2}/Sample", protocol, address, port)));
//...Some configuration (bindings, behaviors, etc.)
host.Open();
}
让我的计算机有一个IP 192.168.0.1。当我传递值为"192.168.0.2"的"address"参数时,出现错误
"A TCP error (10049: The requested address is not valid in its context.)
occurred while listening on IP Endpoint=192.168.0.2:1234"
没错,因为这不是我的IP。但在那之后,如果我传递正确的值(我的真实IP),我得到关于IP 192.168.0.2相同的错误!所以我不能重新配置和重启服务器而不重新启动应用程序。
为什么会发生?我怎样才能避免这种行为呢?
看起来WCF在类ExclusiveTCPTransportManager中缓存套接字对象
这对我来说似乎是一个很好的解决方案:
public static class WCFBugWorkaround
{
public static bool IsConnectionPossible(this ServiceHost host)
{
try
{
foreach (var baseAddress in host.BaseAddresses)
{
IPAddress[] ipAddresses = Dns.GetHostAddresses(baseAddress.DnsSafeHost);
IPAddress ipAddr = ipAddresses.Where(e => e.AddressFamily == AddressFamily.InterNetwork).FirstOrDefault();
if (ipAddr == null)
{
return false;
}
using (Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
System.Net.IPEndPoint localEP = new IPEndPoint(ipAddr, baseAddress.Port);
s.Bind(localEP);
}
}
}
catch (Exception ex)
{
return false;
}
return true;
}
}
ServiceHost host = ...;
...
if (host.IsConnectionPossible())
{
host.Open();
}
谢谢Francheska给我指明了正确的方向。
我无法从您的问题中看到您如何添加正确的端点,但我怀疑您正在尝试修改端点地址。使用WCF服务,您不能在调用
之后更改端点地址。host.Open();
因为此时服务已启动(如果没有错误),并接受来自指定地址和端口号的客户端的请求。
如果您希望在新地址托管服务,则需要使用正确的端点地址创建一个新的ServiceHost对象(并处理旧的端点地址)。
编辑:玩了你发布的示例解决方案后,我找到了解决问题的方法。我认为有些事情是错误的,因为你使用相同的端口号,两次尝试(在我下载的示例解决方案中,你没有指定这个,所以端口默认为808)。如果您按照以下方式更改代码,以便在第二次尝试时在基址中指定不同的端口号,则您遇到的错误将消失:
try
{
var host2 = CreateServiceHost("localhost:5432", serviceImpl);
Console.WriteLine("#2, config: " + host2.BaseAddresses.First().ToString());
host2.Open();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
似乎在WCF本身下面有一些错误,可能在套接字级别,其中端口在第一个错误与不正确的IP之后仍然不可用。
我做了一个快速谷歌,发现这篇文章有人遇到延迟重用端口后关闭一个套接字。如果您总是需要使用相同的端口号,也许您可以等待一定的时间,让端口再次空闲,然后再尝试再次创建服务主机。