1

4.5 .Net Framework で C# を使用して構築された 2 つのアプリケーションを使用しています。

  1. WPF デスクトップ アプリケーション
  2. 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();

        }
4

1 に答える 1

0

接続できない最も可能性の高い理由は、ServiceHostコンストラクターに渡されたサービス アドレスがないためです。

OnStartWindows サービスのメソッドでこれを試してください。

wcfServiceHostObj = new ServiceHost(typeof(TestWCFService), 
    new Uri[] { "net.pipe://localhost/TestWCFService" });

「WCF ホスト - 正常に開始されました」ServiceHostという表示は、エラーがスローされなかったことを意味するだけです。WCF サービスがリッスンしていて、メッセージを受信する準備ができていることを保証するものではありません。

また、次のusingように WCF クライアントでステートメントを使用します。

using (channel as IDisposable)
{
    channel.SendMessage("First Message");
}

悪い習慣と見なされます。

于 2016-07-29T07:10:46.333 に答える