2012-04-17 7 views
3

Windows 2008 R2サーバーでWindowsサービスとしてWCFサービスをホストしようとしています。私はmsdn(found here)によって提供された指示に従った。すべてがVisual Studioの同じソリューションの一部である限り、すべて正常に動作します。しかし、(同じマシン上の)別のソリューションでクライアントを作成しようとしましたが、サービスを見つけることができませんでした。以下に示す「サービス参照エラーの追加」が表示されます。WindowsサービスでホストされているTCP WCFサービス

enter image description here

私の目標は、リモートでのWCFサービスにアクセスできるようにすることですが、私は、クライアントが同じクライアント内で作成された場合を除きでもそれをローカルにアクセスするために見えることはできません。誰かがこれを動作させるために私に与えることができるガイド、チュートリアル、または有用なヒントはありますか?

更新: Windowsサービスが実行されているにもかかわらず、WCFサービスは、任意のポートを聞いていないようですようです。これは、それが実行されていないことを示唆します。これは、なぜ私がサービスを実行していないすべての人の最初の考えを説明します。私は、Windowsサービスが実行されていて、同じソリューションクライアントが機能していたので、WCFサービスも同様に動作していると仮定していました。同じソリューションクライアントを実行するたびに、Visual StudioがWCFサービスを開始していたことがわかります。

なぜWindowsサービスがWCFサービスを開始していないのですか?何か案は?

Discoverボタン:

+0

サービス参照を追加しようとしていますか? –

+0

はい、上記のように、私は、サービスの開始を含むチュートリアルで説明されているすべての作業をしていた。 –

+0

そうですが、新しいクライアントからサービス参照を追加しようとしたときに実際に開発したサービスを持っていましたか? –

答えて

6

(上記の質問で提供):サービスが正しいポートで待機している場合は、このコマンドが返されます。彼らは両方のWindowsサービスとWCFサービスService1の両方の名前を既定の名前です。

WindowsサービスはWCFサービスを開始すると考えられていましたが、両方のサービスが同じ名前を持っていたため、実際には再び開始しようとしていました。

myServiceHost = new ServiceHost(typeof(Service1)); 

この問題を修正するには、サービスのいずれかの名前を変更したり、完全にWindowsサービスで参照するときWCFサービスを修飾することができます。

myServiceHost = new ServiceHost(typeof(WcfServiceLibrary1.Service1)); 

面白いことは、Visual Studioは、WCFサービスが実行されていないことに気づくには十分にスマートであり、それは舞台裏でインスタンスを起動するので、それが作品のように、まだ提供されているコードが見えることです。

Visual Studioが私から問題を隠していたので、修正するのは簡単なバグでしたが、私はEspen Burudの助けがなければ見つけられなかったでしょう。

+0

良い発見!だから微妙。 –

3

サービスについて学ぶためにサービス参照を追加するための2つの方法があり、現在のソリューションでプロジェクトを検索します。
Goボタン:[アドレス]ボックスのサービスに接続し、メタデータを取得します。

Goをクリックする前に、サービスを実際に実行する必要があります。私はちょうどあなたがnet.tcp URLに接続しようとしているあなたのスクリーンショットから気づい

EDIT。私はMEXのためにhttpを使うのがより一般的だと思います。

<services> 
    <service behaviorConfiguration="WcfServiceLibrary1.Service1Behavior" 
    name="WcfServiceLibrary1.Service1"> 
    <endpoint address="" binding="netTcpBinding" bindingConfiguration="" 
     contract="WcfServiceLibrary1.IService1"> 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    <endpoint address="mex" binding="mexTcpBinding" bindingConfiguration="" 
     contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
     <add baseAddress="net.tcp://localhost:8523/Service1" /> 
     <add baseAddress="http://localhost:8524/Service1" /> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 

HTTPベースアドレスのための別のポート番号に注意してください。あなたのapp.configは、次のようになります。その後、「サービス参照の追加」ツールで「http:// localhost:8524/Service1」を使用します。また、Webブラウザで接続することもできます。 HTTP GET経由のメタデータの交換を可能にするに

(例えばブラウザから)、あなたも行動を経由して、それを有効にする必要があります

<behaviors> 
    <serviceBehaviors> 
    <behavior> 
     <serviceMetadata httpGetEnabled="True"/> 
    </behavior> 
    </serviceBehaviors> 
</behaviors> 

私はサービス参照の追加ツールがその気にかはわかりません。

http getアクセス(httpGetEnabled = "False")を許可しない場合でも、MEXを有効にするには(プログラムで追加しない限り)この動作を含める必要があります。

+0

はい、私はこれを理解しますが、それは本当に私の問題に役立たない。 –

+0

ちょうど何かに気づいた - 私の編集を参照してください。 –

+0

私が上で参照したチュートリアルでは、httpベースアドレスを追加せずにtcpによるメタデータの交換を利用しています。私はそれが動作するかどうかを確認するためにhttpベースアドレスを追加しようとすることができますが、私は本当にhttpを介してサービスへのアクセスを与えたくありません。 –

2

私はMSDNの記事をテストしていますが、修正なしで動作します。サーバー上でファイアウォールが有効になっている場合は、サービスのルールをいくつか追加する必要があります。

サービスが正しいtcpポートでリッスンしていることを確認するには、コマンド:netstat -aを使用します。これは、MSDNで提供チュートリアルに問題があったことが判明し

Proto Local Address   Foreign Address  State 
TCP 0.0.0.0:8523   machinename:0   LISTENING 
+0

私はそれを変更せずに作業しています。ただし、同じソリューション内にクライアントを作成します。サービスの同じソリューションの外にクライアントを作成しようとすると、同じマシン上にあり、サービスが正常に動作していても、サービスに接続できません。 –

+0

別の解決策でクライアントを作成したときにも、私にとってはうまくいきます。 –

+1

私はあなたが提案した 'netstat'コマンドを試してみました.Windowsサービスが動作していてもwcfサービスは動作していないように見えます。この同じ問題がありましたか?何が問題なの? –

0

私は問題を把握することができました。 WCFプロジェクトのapp.configのサービス構成を実際のWindowsサービスのapp.configにコピーしていないため、サービスでエンドポイントが認識されませんでした。私がそれをしたら、それは正しく機能しました。

これは、WCF app.configのコメントに記載されていますが、これも元のMSDNの記事ではっきりしませんでした。

関連する問題