私は最近、Visual Studio から自動生成されたコードに頼るのではなく、自分の WCF サービスを呼び出す独自の ChannelFactory ラッパーを書き始めました。
以前は、自動生成されたプロキシを使用して、エラー チェックのためにこれを行うことができました。
protected AccessControlServiceClient AccessControlService
{
get
{
// Check if not initialized yet
if (HttpContext.Current.Session["AccessControlServiceClient"] == null)
HttpContext.Current.Session["AccessControlServiceClient"] = new AccessControlServiceClient();
// If current client is 'faulted' (due to some error), create a new instance.
var client = HttpContext.Current.Session["AccessControlServiceClient"] as AccessControlServiceClient;
if (client.State == CommunicationState.Faulted)
{
try { client.Abort(); }
catch { /* no action */ }
client = new AccessControlServiceClient();
HttpContext.Current.Session["AccessControlServiceClient"] = client;
}
return client;
}
}
ChannelFactor でこれをどのように処理すればよいですか? 何か問題が発生した場合にチャネルを処理し、再作成するためのベスト プラクティスは何ですか? たとえば、断続的なネットワーク接続、セッション タイムアウトなどです。
これは私のコードが現在どのように見えるかです:
ProxyBase.cs からのスニペット - チャネルの作成
private void Initialise()
{
lock (_sync)
{
if (_channel != null) return;
_channel = new ChannelFactory<T>(_serviceEndPointUri).CreateChannel();
}
}
UserManagementServiceClient.cs - IUserManagementService は WCF コントラクトです
public class UserManagementServiceClient : ProxyBase<IUserManagementService>
{
public UserManagementServiceClient(string serviceEndPointUri)
: base(serviceEndPointUri)
{
}
public TokenResponse GetToken(TokenRequest request)
{
return Channel.GetToken(request);
}
public LoginResponse Login(LoginRequest request)
{
return Channel.Login(request);
}
public LogoutResponse Logout(LogoutRequest request)
{
return Channel.Logout(request);
}
}
そして最後に、これが私の MVC プロジェクトでの呼び出し方です
protected UserManagementServiceClient UserManagementService
{
get
{
// Check if not initialized yet
if (HttpContext.Current.Session["UserManagementServiceClient"] == null)
HttpContext.Current.Session["UserManagementServiceClient"] = new UserManagementServiceClient("NetTcpBinding_UserManagementService");
var client = HttpContext.Current.Session["UserManagementServiceClient"] as UserManagementServiceClient;
return client;
}
}
そのため、現在、デフォルトの 10 分間のセッションが開始されるたびに、チャネルが既に閉じられているため、エラーが発生します。
ネットワークの切断やセッションのタイムアウトなどを処理するようにコードを強化するにはどうすればよいですか?