背景
我在这里有一个小服务,其工作方式如下:
appdomain回收后,同样的端口被重新使用。这样,客户端仍然知道要连接到哪个端口。WCF 服务器是基于 TCP 的。
回收
在回收发生之前,appdomain 会进行一些清理。最重要的是,WCF servicehost 已关闭,我希望它会释放 TCP-IP 端口。更详细地:
this.serviceHost.Close();
this.serviceHost = null;
// Some other cleanup
GC.Collect(GC.MaxGeneration);
GC.WaitForFullGCComplete();
GC.WaitForPendingFinalizers();
Run Code Online (Sandbox Code Playgroud)
清理后,appdomain 停止,一秒钟后再次启动。停止应用程序域非常简单:
try
{
System.AppDomain.Unload(this.serviceDomain);
this.serviceDomain = null;
}
catch (CannotUnloadAppDomainException err)
{
Console.WriteLine("Cannot unload app domain (attempt #{1}): {0}", err.Message, i + 1);
Thread.Sleep(TimeSpan.FromSeconds(1.0));
}
catch (AppDomainUnloadedException)
{
this.serviceDomain = null;
}
Run Code Online (Sandbox Code Playgroud)
问题
大多数时候一切正常。但是,每隔几周,回收工作正常,但无法访问 WCF 服务器。错误是:
System.ServiceModel.ProtocolException: You have tried to create a channel to a service that
does not support .NET Framing. It is possible that you are encountering an HTTP endpoint.
---> System.IO.InvalidDataException: Expected record type 'PreambleAck', found '72'.
Run Code Online (Sandbox Code Playgroud)
我在这里发现最奇怪的是 WCF 服务器似乎正确设置了所有内容。因此,当我调用 时不会抛出任何异常serviceHost.Open();,这正是我在套接字被另一个进程劫持时所期望的。
我正在寻找的是可能的根本原因以及我可以测试以解决此问题的内容。
我尝试过的事情
问题出现在多台机器上,每隔几周发生一次。重新启动整个过程可解决此问题。
netstat -aonb。(这似乎不太可能,但又一次......)Netstat 报告端口被 PID 4(系统)使用。当服务器按预期工作时,它报告同样的事情。| 归档时间: |
|
| 查看次数: |
1156 次 |
| 最近记录: |