0

ホストされているのと同じ.exeからWCFサービスに接続しようとしています。サービスを WPF アプリケーションで次のようにホストします。

        ServiceHost svc = new ServiceHost(typeof("Namespace.Service"));
        svc.Open();

および構成ファイル

  <service name="Namespace.Service" >
    <endpoint address="Contract/tcp"
              binding="netTcpBinding"
              contract="Namespace.IContract"/>
    <host>
      <baseAddresses>
        <add baseAddress="net.tcp://localhost:9002"/>
      </baseAddresses>
    </host>
  </service>

これにより、別の VS インスタンスを起動し、コンソール アプリを作成して、次の操作を正常に実行できます。

        IChannelFactory<IContract> facContract = new ChannelFactory<IContract>(new NetTcpBinding());
        IContract contract = facContract.CreateChannel(new EndpointAddress("net.tcp://localhost:9002/Contract/tcp"));

        string x = contract.GetProperty; //returns value I would expect

ただし、元の WPF ServiceHost コードを次のように修正すると、サービスにアクセスするとタイムアウト例外がスローされます (注: Console App Service ホストで同じことを行うと、タイムアウトが発生しません...) :

        ServiceHost svc = new ServiceHost(typeof("Namespace.Service"));
        svc.Open();

        IChannelFactory<IContract> facContract = new ChannelFactory<IContract>(new NetTcpBinding());
        IContract contract = facContract.CreateChannel(new EndpointAddress("net.tcp://localhost:9002/Contract/tcp"));

        string x = contract.GetProperty; //<-!!WCF Timeout exception thrown..

WCF トレースは追加の詳細を提供しません (タイムアウト例外がスローされたことを確認するだけです)。何かご意見は?{これは、WCF 例外管理のベスト プラクティスに関する質問ではありません。サービス ホスト内からサービスにアクセスしようとしていますが、この奇妙なタイムアウト例外によってブロックされています}

編集: このタイムアウトは、サービス ホストが WPF アプリケーション (おそらく他のアプリケーション) である場合に発生します。しかし、サービス ホストとしてのコンソール アプリは、期待どおりに動作します (たとえば、自己ホスト型サービスにアクセスできます)。この新しい情報を反映するために、タイトルとタグを更新しました...

前もってありがとう、T

4

2 に答える 2

1

これは、WPF サービスホストがサービスを消費するのと同じスレッドでサービスをホストしていたためです。問題はここで定義されています: http://social.msdn.microsoft.com/Forums/en/wcf/thread/74bc9d15-c458-4f1f-81a0-ebded46b68c4。解決策の詳細はこちら: http://msdn.microsoft.com/en-us/library/ms752260.aspx

解決策は、別のスレッド ala でサービス ホストエンドポイントを開始することでした。

    private void StartHostThread()
    {
        // Before opening host, add endpoints...
        host.AddServiceEndpoint(typeof(IContract)),
                                new NetTcpBinding(), 
                                "Contract/tcp"); //Assumes base address of net.tcp://localhost:9002/

        //For hosting on its own thread, be sure to mark service attribute 
        //  as UseSyncContext == false
        ServiceBehaviorAttribute behavior = host.Description.Behaviors.Find<ServiceBehaviorAttribute>();
        behavior.UseSynchronizationContext = false; 

        host.Open();
    }

ホストがスレッドで開かれると、メイン UI スレッド ala でサービスを消費できます。

        EndpointAddress epoint = new EndpointAddress("net.tcp://localhost:9002/Contract/tcp");
        IContract proxy = ChannelFactory<IContract>.CreateChannel(new NetTcpBinding(), epoint);
        string xyz;
        using (proxy as IDisposable)
        {
            xyz = proxy.GetProperty;
        }
于 2012-07-03T19:45:45.237 に答える
0

あなたの contract.GepProperty が何をするのかわかりません (ただし、そもそもプロパティであってはなりません)

これは期待どおりに機能します

- - ホスト - -

  static void Main(string[] args)
        {
            var svc = new ServiceHost(typeof(Service1));
            svc.Open();

            IChannelFactory<IService1> facContract = new ChannelFactory<IService1>(new NetTcpBinding());
            var contract = facContract.CreateChannel(new EndpointAddress("net.tcp://localhost:9002/Contract/tcp"));

            var x = contract.DoWork(); 
        }

- - サービス - -

[ServiceContract]
public interface IService1
{
    [OperationContract]
    string DoWork();
}

// NOTE: You can use the "Rename" command on the "Refactor" menu to change the class name "Service1" in both code and config file together.
public class Service1 : IService1
{
    public string DoWork()
    {
        return "Hello Work.";
    }
}

--- 構成 ---

<configuration>
    <system.serviceModel>
        <services>
            <service name="HostAndClient.Service1">
                <endpoint address="Contract/tcp" binding="netTcpBinding" contract="HostAndClient.IService1">
                    <identity>
                        <dns value="localhost" />
                    </identity>
                </endpoint>
                <host>
                    <baseAddresses>
                        <add baseAddress="net.tcp://localhost:9002" />
                    </baseAddresses>
                </host>
            </service>
        </services>
    </system.serviceModel>
</configuration>
于 2012-06-22T17:55:44.473 に答える