パブリッシャーサブスクライバーパターンに基づいたシステムに取り組んでいます。WPFアプリケーションで実行されているWCFサービスがあります。サービスに接続するクライアントは多数あります。クライアント側もWPFです。システムのコードスニペットを以下に添付しています。
サービス:
[ServiceContract(Namespace = "http://AutoFXProfitsServer", SessionMode = SessionMode.Required, CallbackContract = typeof(ITradeMirrorClientContract))]
public interface ITradeMirror
{
[OperationContract]
string Subscribe(string userName, string password, int accountID);
[OperationContract]
bool Unsubscribe(string userName, string password, int accountID);
[OperationContract]
void PublishNewSignal(string signalInformation);
}
public interface ITradeMirrorClientContract
{
[OperationContract(IsOneWay = true)]
void NewSignal(string signalInformation);
}
public class NewSignalEventArgs : EventArgs
{
public string SignalInformation;
}
.
.
.
.
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession, AutomaticSessionShutdown = false)]
public class TradeMirrorService : DependencyObject, ITradeMirror
{
.
.
.
.
public string Subscribe(string userName, string password, int accountID)
{
try
{
if (AuthenticationSuccessful)
{
_callback = OperationContext.Current.GetCallbackChannel<ITradeMirrorClientContract>();
_newSignalHandler = new NewSignalEventHandler(NewSignalHandler);
NewSignalEvent -= _newSignalHandler;
NewSignalEvent += _newSignalHandler;
string suffixes = GetSuffixes();
return suffixes;
}
else
{
return "FAILED";
}
}
catch (Exception exception)
{
return "FAILED";
}
}
public bool Unsubscribe(string userName, string password, int accountID)
{
try
{
if (SearchHelper.UnAuthenticateUserCredentials(userName, password, accountID, _helper))
{
_callback = OperationContext.Current.GetCallbackChannel<ITradeMirrorClientContract>();
_newSignalHandler = new NewSignalEventHandler(NewSignalHandler);
NewSignalEvent -= _newSignalHandler;
return true;
}
else
{
return false;
}
}
catch (Exception exception)
{
return false;
}
}
public void PublishNewSignal(string signalInformation)
{
try
{
if (HeartBeatMessage())
{
}
else
{
_systemOrderID++;
signalInformation = TransformSignalInformation(signalInformation, _systemOrderID);
}
var e = new NewSignalEventArgs {SignalInformation = signalInformation};
NewSignalEvent(this, e);
}
catch (Exception exception)
{
}
}
そして私のapp.config:
<?xml version="1.0"?>
<configuration>
<system.serviceModel>
<bindings>
<netTcpBinding>
<binding closeTimeout="23:59:59" openTimeout="23:59:59" receiveTimeout="23:59:59" sendTimeout="23:59:59" transactionFlow="false" transferMode="Buffered"
transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard" listenBacklog="1000" maxBufferPoolSize="524288" maxBufferSize="65536"
maxConnections="1000" maxReceivedMessageSize="65536">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/>
<reliableSession ordered="true" inactivityTimeout="23:59:59" enabled="false"/>
<security mode="None"/>
</binding>
</netTcpBinding>
</bindings>
<!--For debugging purposes set the includeExceptionDetailInFaults attribute to true-->
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="false" httpGetUrl="http://95.138.188.232/autofxprofits/service"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup> </configuration>
システムは問題なく長期間完全に機能します。何が起こるかというと、何らかの理由で(私はそれについては確信が持てませんが)、例外を除いてサービスがクラッシュすることがありました。
CommunicationObjectAbortedExceptionまたはCommunicationObjectFaultedException
System.ServiceModel.CommunicationObjectAbortedException: The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it has been Aborted.
Server stack trace:
at System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrNotOpen()
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at AutoFXProfitsServer.ITradeMirrorClientContract.NewSignal(String signalInformation)
at AutoFXProfitsServer.TradeMirrorService.NewSignalHandler(Object sender, NewSignalEventArgs e) in D:\Work\Trade Mirror - Kumar\AutoFXToolsTradeMirror\AutoFXProfitsServer\Service.cs:line 232
at AutoFXProfitsServer.TradeMirrorService.PublishNewSignal(String signalInformation) in D:\Work\Trade Mirror - Kumar\AutoFXToolsTradeMirror\AutoFXProfitsServer\Service.cs:line 171
また、
System.ServiceModel.CommunicationObjectFaultedException: The communication object, System.ServiceModel.Channels.ServiceChannel, cannot be used for communication because it is in the Faulted state.
Server stack trace:
at System.ServiceModel.Channels.CommunicationObject.ThrowIfDisposedOrNotOpen()
at System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] outs, TimeSpan timeout)
at System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall, ProxyOperationRuntime operation)
at System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage message)
Exception rethrown at [0]:
at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)
at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)
at AutoFXProfitsServer.ITradeMirrorClientContract.NewSignal(String signalInformation)
at AutoFXProfitsServer.TradeMirrorService.NewSignalHandler(Object sender, NewSignalEventArgs e) in D:\Work\Trade Mirror - Kumar\AutoFXToolsTradeMirror\AutoFXProfitsServer\Service.cs:line 235
at AutoFXProfitsServer.TradeMirrorService.NewSignalEventHandler.Invoke(Object sender, NewSignalEventArgs e)
at AutoFXProfitsServer.TradeMirrorService.PublishNewSignal(String signalInformation) in D:\Work\Trade Mirror - Kumar\AutoFXToolsTradeMirror\AutoFXProfitsServer\Service.cs:line 174
繰り返しになりますが、これらの例外はPublishNewSignalメソッドで発生します。私がすべてのテストから理解した理由の1つは、クライアントが異常に閉じられたときにこれが発生することです。たとえば、クライアントプロセスはタスクマネージャなどから閉じられます。
しかし、この問題は大きな苦痛であり、この安定性の問題を修正せずに前に進むことはできません。通信オブジェクトに障害が発生し、サービスがクラッシュする理由について誰かが知っていますか?
これについていくつかの肯定的なフィードバックを得ることを望んでいます。
ありがとう。Umer