0

これは非常に単純な WCF サンプルであり、なぜ失敗するのかわかりません。

これは、WCF クラス ライブラリ プロジェクトで定義されています。

これはコントラクトを定義するインターフェースです:

<ServiceContract()> _
Public Interface IService1

    <OperationContract()> _
    Function GetData(ByVal value As Integer) As String

    <OperationContract()> _
    Function Ping() As Boolean

End Interface

これはインターフェースの実装です:

<ServiceBehavior(IncludeExceptionDetailInFaults:=True)> _
Public Class Service1
    Implements IService1

    Public Function GetData(ByVal value As Integer) As String Implements IService1.GetData
        Return String.Format("You entered: {0}", value)
    End Function

    Public Function Ping() As Boolean Implements IService1.Ping
        Return True
    End Function
End Class

次に、Server というコンソール アプリケーションで、上で定義したサービスへのサービス参照を追加しました。次のようにサービス ホストを作成します。

static void Main(string[] args)
{
   try
   {
      ServiceHost serviceHost = new ServiceHost(typeof(ServiceReference.Service1Client));
      NetTcpBinding netTcpBinding = new NetTcpBinding();

      serviceHost.AddServiceEndpoint(typeof(ServiceReference.IService1), netTcpBinding, "net.tcp://localhost:9007/Service/");

      Console.WriteLine("Service started at net.tcp://localhost:9700/Service");

      serviceHost.Open();

      Console.WriteLine("Host opened");
      Console.ReadLine();
   }
   catch (Exception ex)
   {
      Console.WriteLine(ex.Message);
      Console.Read();
   }
   finally
   {
       Console.WriteLine("Service closed");
   }
}

次に、Client という別のコンソール アプリケーションで、サービスへのサービス参照を追加し、次のようにプロキシ クライアントを作成します。

static void Main(string[] args)
{
   NetTcpBinding netTcpBinding = new NetTcpBinding();

   try
   {
       var serviceClient = new Client.ServiceReference1.Service1Client(netTcpBinding, new EndpointAddress("net.tcp://localhost:9007/Service/"));
       serviceClient.InnerChannel.OperationTimeout = TimeSpan.FromMinutes(10);

       Console.WriteLine("Pinging server");               

       if (serviceClient.Ping())
       {
          Console.WriteLine("Getting Data");

          var result = serviceClient.GetData(1);

          Console.WriteLine("Result is " + result);
       }
       else
       {
          Console.WriteLine("Server is not responding");
       }
   }
   catch (Exception ex)
   {
       Console.WriteLine(ex.Message);
   }

   Console.ReadLine();
}

実行するServer.exeと、Service started at net.tcp://localhost:9700/Serviceと表示されます

実行すると、サーバーにPingがClient.exe表示されます

次に、WCF クラス ライブラリ プロジェクトでデバッグできないエラーが発生し、最後に例外が発生しClient.exeます。

net.tcp://localhost:9007/Service/ に送信されたこの要求操作は、構成されたタイムアウト (00:01:00) 内に応答を受信しませんでした。この操作に割り当てられた時間は、より長いタイムアウトの一部であった可能性があります。これは、サービスがまだ操作を処理中であるか、サービスが応答メッセージを送信できなかったことが原因である可能性があります。(チャネル/プロキシを IContextChannel にキャストし、OperationTimeout プロパティを設定することによって) 操作のタイムアウトを増やすことを検討し、サービスがクライアントに接続できることを確認してください。

私のラップトップではシンプルでローカルで実行されているので、タイムアウトなどの問題はないと思います。

誰か光を当てることができますか...感謝します

4

1 に答える 1

0

コードは、サーバーを開く前に静的文字列を出力し、サーバーを開いた後に文字列を出力します。

Console.WriteLine("Service started at net.tcp://localhost:9700/Service");

serviceHost.Open();

Console.WriteLine("Host opened");

最初のメッセージが表示されると言いましたが、2 番目のメッセージが表示されるとは言いませんでした。そのメッセージが表示されない場合、serviceHost.Open(); への呼び出しに何か問題があるのではないかと考えています。

WCF http://www.dotnetfunda.com/articles/article704-using-nettcpbinding-in-wcf-.aspxで NetTcpBingings を使用する例を次に示し ます。

他の人のコードから始めて、そこから変更することが役立つ場合があります。

于 2012-05-08T18:56:36.533 に答える