一部の WCF サービスを使用するホスト プロセスが実行されている場合、すべて問題ありません。ただし、ホスティング プロセスが実行されていない場合、WCF はオブジェクトを作成して使用することができません。
つまり、「ScrnSrvcR2.exe」というプロセスがあり、WCF 経由で公開される「ScreensApi」オブジェクトをホストしています。そのため、「ScrnSrvcR2.exe」プロセスが実行されている場合、WCF クライアントは接続して「ScreensApi」オブジェクトを使用できます。ただし、「ScrnSrvcR2.exe」プロセスが実行されていない場合、クライアントは接続できません。
質問 - リモート システム (リモート システムの特定のケースとしてlocalhostも含む) を作成して、「ScreensApi」オブジェクトを作成する最初の要求によってそのホスティング プロセスを自動的に開始することは可能ですか?
したがって、この場合、リモート システムがCreateRemoteComObject関数を呼び出すことができ、オブジェクト ホスティング プロセスが自動的に開始され、オブジェクトのインスタンスを提供するときに、WCF からある種のDCOM スタイルの機能が必要になります。
WCFでそれを行うことは可能ですか? どのように?
以下の参照用に、WCF オブジェクトを作成するために使用しているコードを示します。
// this code works fine when "ScrnSrvcR2.exe" is running
protected void InitializeScreens()
{
string endPointAddr = null;
string transport = "net.tcp://";
string hostAddress = "localhost";
string servicePath = "ScreensApi";
// [... optional reading of transport, hostAddress, servicePath values skipped... ]
if (string.IsNullOrEmpty(endPointAddr))
endPointAddr = transport + hostAddress + "/" + servicePath;
System.ServiceModel.Channels.Binding bnd = null;
NetTcpBinding tcpBinding = new NetTcpBinding();
bnd = tcpBinding;
tcpBinding.Name = "epNetTcp"; // this name is defined in config file
EndpointAddress endpointAddress = new EndpointAddress(endPointAddr);
bool isGoodProxy = false;
try
{
try
{
this.ScreensProxy = new ScreensApiClient(bnd, endpointAddress);
string un = null, pw = null;
// [... optional reading of login/password skipped...]
if (!string.IsNullOrEmpty(un) && !string.IsNullOrEmpty(pw))
{
ToLogger(TraceLevel.Verbose, string.Format("Station[ {0} ].Screens => Use credentials: {1}, {2}", this.Name, un, pw));
this.ScreensProxy.ClientCredentials.UserName.UserName = un;
this.ScreensProxy.ClientCredentials.UserName.Password = pw;
}
un = null; pw = null;
// [... optional reading of login/password skipped...]
if (!string.IsNullOrEmpty(un) && !string.IsNullOrEmpty(pw))
{
ToLogger(TraceLevel.Verbose, string.Format("Station[ {0} ].Screens => Use Windows-credentials: {1}, {2}", this.Name, un, pw));
this.ScreensProxy.ClientCredentials.Windows.ClientCredential.UserName = un;
this.ScreensProxy.ClientCredentials.Windows.ClientCredential.Password = pw;
}
this.ScreensProxy.Open();
this.ScreensProxy.Ping(); // note: Ping() is a method of ScreensApi object, just to check if it is alive
this.ScreensStationDescriptor = this.ScreensProxy.CreateStationDescriptor(this.Owner.Name, this.Name, CommonUtils.HostInfoStamp());
this.ScreensProxy.InitializeStation(this.ScreensStationDescriptor);
this.ScreensRuntimeContext = this.ScreensProxy.GetStationContext(this.ScreensStationDescriptor);
isGoodProxy = true;
}
catch (Exception exc)
{
ToLogger(TraceLevel.Error, string.Format("Station[ {0} ].Screens -> {1}\n at {2}", this.Name, ErrorUtils.FormatErrorMsg(exc), exc.StackTrace));
throw;
}
}
finally
{
if (!isGoodProxy)
{
this.ScreensProxy = null;
this.ScreensStationDescriptor = null;
this.ScreensRuntimeContext = null;
ToLogger(TraceLevel.Warning, string.Format("Station[ {0} ].Screens -> Remove ScreensProxy object ref as invalid!", this.Name));
}
}
}
WCF オブジェクト ホスティング プロセスを自動的に開始するには、コードに何を追加する必要がありますか?
前もって感謝します。