我有三个相同的WCF自托管Net.Tcp服务在三台独立的机器上监听。从我的客户端,我为每个服务器创建一个任务,其中包含我的WCF客户端实例(每个服务器一个),最终异步调用每个服务上的一个WCF操作。
我注意到的是服务电话不可靠。也就是说,在某些情况下,呼叫会起作用,而在其他情况下则不起作用。每次运行都在三台机器中的另一台机器上失败,但总是只有三台机器中的一台,从不是两台或全部三台。
我在所有服务器和我的客户端都启用了详细的WCF跟踪。对于失败的服务器,服务器端没有证据表明已建立连接。在客户端,服务跟踪日志甚至不指示已进行连接尝试。我的控制台调试日志显示代码确实被击中了。
这是我调用的异步方法:
public async Task InstallAsync(string installerPath, string commandLine)
{
Debug.WriteLine("[{0}] InstallerAgentServiceClient.InstallAsync({1}, {2})", _endpointAddress,
installerPath, commandLine);
try
{
_proxy = new InstallerAgentService.InstallerAgentServiceClient(
new InstanceContext(this), // assign callback class instance
new NetTcpBinding(),
_endpointAddress);
_proxy.InnerChannel.Faulted +=
(sender, args) =>
{
throw new Exception(string.Format("Inner channel faulted for {0}!", _endpointAddress));
};
_proxy.InnerChannel.Closed +=
(sender, args) =>
{
throw new Exception(string.Format("Inner channel closed for {0}!", _endpointAddress));
};
await _proxy.InstallAsync(installerPath, commandLine); // <=== *Sometimes* this doesn't work, and never throws an exception
}
catch (CommunicationException ce)
{
Logger.ErrorException(ce.Message, ce);
_proxy.Abort();
}
catch (TimeoutException te)
{
Logger.ErrorException(te.Message, te);
_proxy.Abort();
}
catch (Exception e)
{
Logger.ErrorException(e.Message, e);
_proxy.Abort();
throw;
}
}
客户端app.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
<appSettings>
...
</appSettings>
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Verbose, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging"
switchValue="Verbose">
<listeners>
<add name="xml" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xml"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="c:\logs\Cmc.Installer.App.svclog" />
</sharedListeners>
<trace autoflush="true">
<listeners>
<add name="logListener" type="System.Diagnostics.TextWriterTraceListener"
initializeData="c:\logs\Cmc.Installer.App.log.txt" />
<add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener" />
</listeners>
</trace>
</system.diagnostics>
<system.serviceModel>
<diagnostics>
<messageLogging maxMessagesToLog="30000"
logEntireMessage="true"
logMessagesAtServiceLevel="true"
logMalformedMessages="true"
logMessagesAtTransportLevel="true"
logKnownPii="true">
</messageLogging>
</diagnostics>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_IInstallerAgentService"
openTimeout="00:00:30"
sendTimeout="01:00:00"
closeTimeout="00:00:30"
receiveTimeout="10675199.02:48:05.4775807">
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address=""
binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IInstallerAgentService"
contract="InstallerAgentService.IInstallerAgentService" name="NetTcpBinding_IInstallerAgentService">
<identity>
<userPrincipalName value="c2kbuild@mydomain.com" />
</identity>
</endpoint>
</client>
</system.serviceModel>
</configuration>
服务app.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="MsiLog" value="C:\logs\Cmc.Installer.Agent.MSI.log.txt" />
</appSettings>
<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Verbose, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="xml" />
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging"
switchValue="Verbose">
<listeners>
<add name="xml" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xml"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="c:\logs\Cmc.Installer.Agent.svclog" />
</sharedListeners>
<trace autoflush="true">
<listeners>
<add name="logListener" type="System.Diagnostics.TextWriterTraceListener"
initializeData="c:\logs\Cmc.Installer.Agent.Console.log.txt" />
<add name="consoleListener" type="System.Diagnostics.ConsoleTraceListener" />
</listeners>
</trace>
</system.diagnostics>
<system.serviceModel>
<diagnostics>
<messageLogging maxMessagesToLog="30000"
logEntireMessage="true"
logMessagesAtServiceLevel="true"
logMalformedMessages="true"
logMessagesAtTransportLevel="true">
</messageLogging>
</diagnostics>
<behaviors>
<serviceBehaviors>
<behavior name="mexBehavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netTcpBinding>
<binding openTimeout="00:00:30"
sendTimeout="01:00:00"
closeTimeout="00:00:30"
receiveTimeout="10675199.02:48:05.4775807">
</binding>
</netTcpBinding>
</bindings>
<services>
<service behaviorConfiguration="mexBehavior" name="Cmc.Installer.Agent.InstallerAgentService">
<endpoint address=""
binding="netTcpBinding"
bindingNamespace="http://mydomain.com/installer/2014/05"
contract="Cmc.Installer.Agent.IInstallerAgentService" />
<host>
<baseAddresses>
<add baseAddress="http://*:8890" />
<add baseAddress="net.tcp://*:8889" />
</baseAddresses>
</host>
</service>
</services>
</system.serviceModel>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
</startup>
</configuration>