4

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

ここに画像の説明を入力

私の目標は wcf サービスにリモートでアクセスできるようにすることですが、クライアントが同じクライアント内で作成されていない限り、ローカルにアクセスすることさえできないようです。これを機能させるために誰かが私に与えることができるガイド、チュートリアル、または役立つヒントはありますか?

更新: Windows サービスが実行されていても、WCF サービスはポートをリッスンしていないようです。これは、実行されていないことを示唆しています。これは、誰もが最初に私がサービスを実行していないと思った理由も説明しています。Windows サービスが実行されていて、同じソリューション クライアントが機能していたため、WCF サービスも機能していると想定していました。同じソリューション クライアントを実行するたびに、Visual Studio が WCF サービスを開始していたことがわかりました。

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

4

4 に答える 4

7

MSDN が提供するチュートリアル (上記の質問で提供) に問題があることが判明しました。Service1彼らは、両方のデフォルト名であるWindows サービスと WCF サービスの両方に名前を付けました。

Windows サービスは WCF サービスを開始すると想定されていましたが、両方のサービスが同じ名前を持っていたため、実際にはそれ自体を再開始しようとしていました。

myServiceHost = new ServiceHost(typeof(Service1));

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

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

おもしろいことに、Visual Studio は WCF サービスが実行されていないことを認識し、バックグラウンドでインスタンスを起動するほどスマートであるため、提供されたコードはまだ機能しているように見えます。

修正するのは簡単なバグでしたが、Visual Studio によって問題が隠されていたため、Espen Burud の助けがなければ発見できなかったと思います。

于 2012-04-18T13:57:45.567 に答える
3

Add Service Reference がサービスについて学習するには、次の 2 つの方法があります。

Discoverボタン: 現在のソリューションでプロジェクトを検索します。
Goボタン: [アドレス] ボックスのサービスに接続し、メタデータを取得します。

をクリックする前に、実際にサービスを実行する必要がありますGo

編集

スクリーンショットから、net.tcp URL に接続しようとしていることがわかりました。MEX には http を使用する方が一般的だと思います。app.config は次のようになります。

<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 ベース アドレスの異なるポート番号に注意してください。次に、サービス参照の追加ツールで「http://localhost:8524/Service1」を使用します。また、Web ブラウザーで接続できる必要があります。

http GET (ブラウザーなどから) を介したメタデータ交換を許可するには、ビヘイビアーを介して有効にする必要もあります。

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

サービス参照の追加ツールがそれを考慮しているかどうかはわかりません。

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

于 2012-04-17T15:17:15.730 に答える
2

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

サービスが正しい tcp ポートでリッスンしていることを確認するには、次のコマンドを使用できますnetstat -a。サービスが正しいポートでリッスンしている場合、このコマンドは次を返します。

Proto  Local Address          Foreign Address        State
TCP    0.0.0.0:8523           machinename:0          LISTENING
于 2012-04-17T19:47:45.113 に答える
0

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

これは、WCF app.configのコメントに記載されていますが、私がフォローした元のMSDNの記事では明確にされていませんでした。

于 2012-08-10T11:05:55.510 に答える