2009-06-05 6 views
-1

私はWPFアプリケーションをやっていますが、WCFサーバーでも問題はありません。私はServiceHostを開いてクライアントのポートで待ち受ける必要があります。それは始まりますが、私が持っている問題は、ホストのhost.openのコードを記述して、の後のコンストラクタにthis.InitializeComponent()が例外で失敗するということです。私がボタンでホストを開き、アプリを起動した後に押すと、問題なく動作します。c#WCF host.openに失敗しました

どうしてこの問題を解決できますか?

私はtcp.netチャンネルを利用しています。私はアプリケーションでそれをホストしていますが、受信した例外は既に登録されているサービスに関するものです。クライアント上

例外は次のとおりです。

inner exception message :"An existing connection was forcibly closed by the remote host"
error number: 10054
Socket error: System.Net.Sockets.SocketError.ConnectionReset

おかげ

ウォーリー

コンストラクタは次のとおりです。

public Window1() 
{ 
    this.InitializeComponent(); 
    starthost(); 
} 

private void starthost() 
{ 
    host = new ServiceHost(typeof (Window1), 
          new Uri[]{ new Uri("net.tcp://localhost:8000") }); 

    host.AddServiceEndpoint(typeof(IGanador), new NetTcpBinding(), "Contador"); 
    host.open(); //it fails with this line here but not in a button 
} 
+0

あなたのコードはどうですか?私が推測しなければならないことは、コードを2回実行するようなコードを書いているように聞こえると思います。 – tomasr

+0

私は、System.ServiceModelがクライアント要求を受け取るたびに私のwindow1コンストラクタを呼び出していることを知りました。これはMicrosoftのバグですか?それとも期待される行動ですか? それはちょうど私に意味をなさない。 –

+0

いいえ、おそらく、デフォルトの「通話」インスタンシングモードがオンになっている可能性があります。これは予想される動作です。クライアントからの各要求はサーバーのインスタンスを起動します。 –

答えて

3

だから私はこれを正しく得るのですか?あなたの "Window1"はWPFウィンドウクラスで、サービス契約IGanadorを実装していますか?これはちょっと奇妙に思えます。 IContadorを実装する "GanadorService"?その後、このクラスは、あなたのウィンドウではなくリクエストごとに作成/インスタンス化されます。

public Window1() 
{ 
    this.InitializeComponent(); 
    starthost(); 
} 

private void starthost() 
{ 
    host = new ServiceHost(typeof (GanadorService), 
          new Uri[]{ new Uri("net.tcp://localhost:8000") }); 

    host.AddServiceEndpoint(typeof(IGanador), new NetTcpBinding(), "Contador"); 
    host.open(); //it fails with this line here but not in a button 
} 


public class GanadorService : IGanador 
{ 
    .... (whatever methods you need) ..... 
} 

私は願っています!

マルク・

+0

私はguiを変更する必要があり、Servicehostのインターフェイスを実装するクラスにウィンドウのハンドルを渡す方法がわかりませんでしたので、そのようにしました。私はコンストラクタを呼び出さないので、ServiceModelはそれを直接行います。それを行う方法はありますか?ありがとう... –

0

こんにちは
は私がmarc_s
のコメントへの多くは、私は私のWINDOW1

[ServiceBehaviorに次の属性を追加することsinglentonののServiceHost
を作成し、問題のおかげで解決(InstanceContextMode = InstanceContextMode.Single )]

これをコンストラクタに渡します。

host = new ServiceHost( this、 新しいUri [] {新しいUri( "net。tcp:// localhost:8000});

私は、これはWCFインスタンス経営管理論の説明と素晴らしい記事へのリンクである
とにかく1つのクライアント

おかげで持っているので、それは素晴らしい作品:

http://msdn.microsoft.com/en-us/magazine/cc163590.aspx

0
  1. を使用してサービスとして使用できるパラメータは1つだけです。操作

    [OperationContract] 
    void SaveEmployeeDetails(EmployeeDetails emp); 
    
  2. サービス操作は、どちらかMessagecontractタイプを返すべきか、それが

    [OperationContract] 
    EmployeeDetails GetEmployeeDetails(); 
    
  3. サービス操作は受け入れ、メッセージのみの契約タイプを返します任意の値を返すべきではありません。他のデータ型は許可されません。

    [OperationContract] 
    EmployeeDetails ModifyEmployeeDetails(EmployeeDetails emp); 
    

注:タイプはメッセージとデータコントラクトの両方を持っている場合は、サービス操作は、メッセージのみの契約を受け入れます。

関連する問題