2009-03-25 6 views
4

サービスとして、またはWindowsフォームアプリケーションとして実行できるWCFサーバーがあります。 Windows Formsアプリケーションとして実行すると、クライアントアプリケーション経由で接続できます。しかし、私は同じコードを使用してサービスとして実行すると、私はそれに接続することはできません。私は、サービスが実行中であり、その作業を行っていることを確認しました。以下はサーバーの設定ファイルです。 OnStartメソッドが呼び出された後WCFはapplictionとして動作しますが、サービスとしては動作しません。

<system.serviceModel> 
    <services> 
    <service name="Cns.TrafficCopService.ManagementService"> 
     <host> 
     <baseAddresses> 
      <add baseAddress="http://localhost:8000/TrafficCop/ManagementService" /> 
     </baseAddresses> 
     </host> 
     <endpoint address="" binding="wsHttpBinding" contract="Cns.TrafficCopService.IManagementService" /> 
    </service> 
    </services> 
</system.serviceModel> 

とそのホスティングコードは、100ミリ秒と呼ばれる:

if (this.serviceHost != null) 
{ 
    this.serviceHost.Close(); 
} 

this.serviceHost = new ServiceHost(typeof(ManagementService)); 
this.serviceHost.Open(); 

とクライアントの設定ファイル:あなたがサービスを作成するコードを取ることでした

<system.serviceModel> 
    <bindings> 
    <wsHttpBinding> 
     <binding name="WSHttpBinding_IManagementService" /> 
    </wsHttpBinding> 
    </bindings> 
    <client> 
    <endpoint 
     address="http://localhost:8000/TrafficCop/ManagementService" 
     binding="wsHttpBinding" 
     bindingConfiguration="WSHttpBinding_IManagementService" 
     contract="IManagementService" 
     name="WSHttpBinding_IManagementService"> 
    </endpoint> 
    </client> 
</system.serviceModel> 
+0

どこでホスティングコードを実行しますか? – Grzenio

+0

クライアントとサーバーは同じマシンにありますか?私は "localhost"が問題の一部ではないのだろうか...リモートクライアントは "localhost"を要求しないだろう... –

+1

彼らは同じマシン上にある。ここでもアプリケーションとして動作しますが、サービスとしては動作しません。 –

答えて

2

サービスをホスティングするための残りのコードを投稿できますか?

サービスを開始するクラスは、 "ServiceBase"から継承する必要があり、 "OnStart"および "OnStop"メソッドを実装する必要があります。これらのメソッドはサービスコンソールによって起動され、サービスプロセスを開始および停止するので、これらのメソッドでServiceHostを開いたり閉じたりする必要があります。おそらくあなたがそれをやっていないのだろうかと疑問に思います。

+0

私は実際にそれをやっています。 –

+0

私が使用していたTimerクラス(System.Threading.TimerとSystem.Forms.Timerが正常に動作していませんでした)。正しく動作しているSystem.Timers.Timerに置き換えました。 –

0

ホストから?サービスとして実行すると、ServiceHostを作成しないか、または参照を保持しない(ガーベジコレクションされる)

+0

サービスを保持するフィールドはサービス自体にあり、ガベージコレクションされてはいけません –

1

サービスが実行されているアカウントとして?おそらく、ポートを開く権限がないために、サービスが開始に失敗したのだろうかと思います。

サービスを自分のIDで(サービスとして)実行してみてください。それが動作する場合は、アクセス許可の問題です。最も可能性が高いのはHTTP.SYSのアクセス許可です。

アクセスを割り当てるには、Vista/Window 7の場合はnetsh、xpの場合はhttpcfgを使用します。

+0

また、同じマシンにない場合は、実際の名前に変更する必要があります –

+0

私は自分自身で実行していました(サービスとして実行する権利を持つローカル管理者)。 –

+0

ショットの価値があります。 –

0

同じマシン上にいる場合は、WSHttpBindingの代わりにNetNamedPipeBindingを使用することをお勧めします。それはより速いです。道路を横断してマシンを使用する必要がある場合は、いつでもws-httpに戻ることができます。

サービスがTaskManagerを介して実際に動作していることを確認してください。そうでない場合は、Debugger.Break()ステートメントをサービスのコンストラクタに配置し、ステップを実行して起動に失敗した場所を見つけます。 Hereは、C#でWindows NTサービスを作成するための簡潔なステップバイステップです(必要な場合)。

+0

サービスが実行中で、作業。 –

0

アドレスを登録できないというイベントログには何もありませんか?

サービスをデバッグしようとしましたか(ビジュアルスタジオを使用してプロセスに接続しましたか)

0

WinFormsアプリケーションとサービスの両方の設定ファイルで設定が定義されていることを確認しましたか?

関連する問題