4.5 .Net Framework で C# を使用して構築された 2 つのアプリケーションを使用しています。
- WPF デスクトップ アプリケーション
- Windows サービス
条件に基づいてデータ/オブジェクトの状態を頻繁に共有する必要があるため、IPC(プロセス間通信)アプローチを使用して互いに話し合う必要があります。
netNamedPipeBinding を使用した WCF は、非常に柔軟なソリューションのようです。WCF サーバーとクライアントを作成し、コンソール アプリケーションで正常にホストされることをテストしました。
このソリューションが機能したので、WCF サーバーを Windows サービスでホストする必要がありました (これが私の最終的な要件です)。
アプリケーションを正常にホストできましたが (目に見えるエラーが表示されないため推測できます)、クライアントを接続できません。WcfTestClient.exe ツール (Visual Studio の既定のツール) を使用し、コンソール アプリケーションから接続しようとしましたが、エラーが発生し続けるため、どれも機能していないようです - net.pipe://localhost/ からメタデータを取得できませんTestWCFService/mex . 詳細は以下に追加。
Windows サービスを管理者権限で登録し、コンソール アプリ テスト クライアントと WcfTestClient.exe を同じユーザーで実行しました。
当然のことながら、私は何かが欠けています、それを修正するためにあなたの助けに感謝します.
これがコードです。WindowsサービスでWCF netNamedPipeBindingサービスをホストするために使用しています。
protected override void OnStart(string[] args)
{
try
{
if (wcfServiceHostObj != null)
wcfServiceHostObj.Close();
wcfServiceHostObj = new ServiceHost(typeof(TestWCFService));
wcfServiceHostObj.Open();
EventLog.WriteEntry(ServiceName, "WCF Host - Started Successfully ", EventLogEntryType.Information);
}
catch (Exception ex)
{
EventLog.WriteEntry(ServiceName, "exception raised " + ex.InnerException, EventLogEntryType.Error);
throw;
}
}
エラー: net.pipe://localhost/TestWCFService/mex からメタデータを取得できません これがアクセス権のある Windows (R) Communication Foundation サービスである場合は、指定されたアドレスでのメタデータ公開が有効になっていることを確認してください。メタデータの公開を有効にする方法については、MSDN のドキュメント ( http://go.microsoft.com/fwlink/?LinkId=65455.WS-Metadata ) を参照してください。Exchange エラー URI: net.pipe://localhost/TestWCFService/mex メタデータに解決できない参照が含まれています: 'net.pipe://localhost/TestWCFService/mex'。メッセージを受け入れることができる net.pipe://localhost/TestWCFService/mex でリッスンしているエンドポイントはありませんでした。これは、多くの場合、アドレスまたは SOAP アクションが正しくないことが原因です。詳細については、InnerException (存在する場合) を参照してください。パイプ エンドポイント 'net.pipe://localhost/TestWCFService/mex' がローカル コンピューターで見つかりませんでした。
ここで私のWCFサーバー構成設定:
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="TestWCFServiceNetPipeBehavior">
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceMetadata />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="TestWCFServiceNetPipeBehavior"
name="WCFHostTest.WCFService.TestWCFService">
<endpoint address="net.pipe://localhost/TestWCFService" binding="netNamedPipeBinding" bindingConfiguration=""
name="TestWCFServiceNetPipeEndPoint" contract="WCFHostTest.WCFService.ITestWCFService" >
</endpoint>
<endpoint address="net.pipe://localhost/TestWCFService/mex" binding="mexNamedPipeBinding" bindingConfiguration=""
name="TestWCFServiceMexPipeEndpoint" contract="IMetadataExchange" />
<host>
<!--<baseAddresses>
<add baseAddress="net.pipe://localhost/TestWCFService" />
</baseAddresses>-->
</host>
</service>
</services>
</system.serviceModel>
クライアント(コンソールアプリケーションにある)の場合、インラインを使用しています。ここにコード
private static void testClient()
{
try
{
string address = "net.pipe://localhost/TestWCFService";
NetNamedPipeBinding binding = new NetNamedPipeBinding(NetNamedPipeSecurityMode.None);
EndpointAddress ep = new EndpointAddress(address);
ITestWCFService channel = ChannelFactory<ITestWCFService>.CreateChannel(binding, ep);
using (channel as IDisposable)
{
channel.SendMessage("First Message");
}
Console.ReadLine();
}
catch (Exception ex)
{
Console.Write(ex.InnerException);
Console.ReadLine();
}