サービスにアプリケーション(インフラストラクチャー以外)のエンドポイントがありません


91

最近、WCFサービス(dll)とサービスホスト(exe)を作成しました。WcfTestClientにサービスを正常に追加できるので、WCFサービスが正しく機能していることがわかります。

しかし、サービスホスト(exe)からWCFを利用しようとすると、問題が発生しているようです。WCF(dll)への参照をサービスホスト(exe)に追加し、exeに必要なコンポーネントを作成できます。サービスインストーラー、サービスホスト、app.configなどをコンパイルし、InstallUtilを使用してexeを最後にインストールします。しかし、Microsoft管理コンソールでサービスを開始しようとすると、サービスは開始後すぐに停止します。

そのため、この問題の正確な原因を調査し始め、イベントビューアのアプリケーションログからこのエラーが発生しました。

説明:

サービスを開始できません。System.InvalidOperationException:サービス 'Service'には、アプリケーション(インフラストラクチャでない)エンドポイントがありません。これは、アプリケーションの構成ファイルが見つからなかったか、構成ファイルでサービス名と一致するサービス要素が見つからなかったか、サービス要素でエンドポイントが定義されていなかったことが原因である可能性があります。

このエラーは実際にはで生成されOnStartます。この呼び出しを実行すると、私のexeのServiceHost.Open()。他の個人がこの問題に遭遇した多数の投稿を見てきましたが、それらのすべてではないにしても、ほとんどがサービス名または契約を主張しています。名前空間とクラス名は指定されていません。私は私の設定ファイルでこれら両方のエントリをチェックしました。exeとdllで、それらは完全に一致します。私は他の人たちを後ろでダブルチェックして、私が一時的に失明していないことを確認しましたが、もちろん彼らはすべてが正しく指定されているように見えたという私と同じ結論に達しました。この時点で何が起こっているのか、私は本当に途方に暮れています。誰かがこの問題を手伝ってくれませんか?

これが発生する可能性のある理由として考えられるもう1つのことは、app.configが読み込まれないことです。少なくとも私が読むべきだと思うものではありません。これは問題でしょうか?もしそうなら、どうすればこの問題に対処できますか?再度、どんな助けもいただければ幸いです。


2
サービスコントラクトの定義は、service.dll.configからservice.exe.configにコピーする必要があります。
John Saunders、

1
サービスのapp.configを見せていただけますか?NTサービスでServiceHostをインスタンス化/開くために何か特別なことをしていますか?
marc_s 2010

回答:


93

私はこの問題を抱えていて、サービス名に名前空間を追加することで解決しました。

 <service name="TechResponse">

なりました

 <service name="SvcClient.TechResponse">

App.configではなくWeb.configで解決されることも確認しました。


ええ、名前空間を変更したので、.svcファイル内のサービスと一致するサービスを見つけることができませんでした(アンダースコアがドットに切り替わりました!)サービス名を簡単に確認すると、何が起きているかがわかりました。

1
私の問題も解決しました、これらの迅速で簡単な修正が大好きです!
vfilby 2012

web.configを追加すると、このエラーの解決に役立ちました。
Ryan Rodemoyer、2014

2
これは私の問題を解決しました!!! どうもありがとう!私のようなすべてのnewbyesの場合:これは本当に明確なチュートリアルをお勧め:lourenco.co.za/blog/2013/08/...
Homer1982

12

エンドポイントには名前空間も必要です。

 <endpoint address="uri" binding="wsHttpBinding" contract="Namespace.Interface" />

これはapp.configにありますが、app.configから削除せずにコードで変更します。新しいエンドポイントアドレスで新しいServiceHostを使用すると、エラーが発生します。
Paul McCarthy

9

考えるべきことの1つは、WCFがWindowsService(WS)から完全に切り離されているかどうかです。WSは、それらを制御したり可視化したりすることが多くないため、苦痛です。ホストWSとは独立してテストできるように、非WSのものすべてを独自のクラスに含めることでこれを軽減しようとしています。このアプローチを使用すると、特にサービスと比較して、WSランタイムで発生している問題を排除するのに役立ちます。

Johnは、おそらく.configファイルの問題であると考えています。WCFは常に実行コンテキスト.configを探します。したがって、異なる実行コンテキストでWCFをホストしている(つまり、コンソールアプリケーションでテストし、WSで展開する)場合は、WCF構成データが適切な.configファイルに移動されていることを確認する必要があります。しかし、私にとっての根本的な問題は、WS gooが邪魔をしているため、問題が何であるかを知らないということです。サービスを任意のコンテキスト(つまり、単体テストまたはコンソール)で実行できるようにまだリファクタリングしていない場合は、そうすることをお勧めします。単体テストでサービスをスピンアップした場合、WSで見られるのと同じ方法で失敗する可能性があります。これは、厄介なWS配管で行うよりもデバッグがはるかに簡単です。


1
迅速に対応していただきありがとうございます。私は自分のapp.configをWCF(dll)からコピーしたので、それが問題だとは思わないようにします。しかし、問題なくWcfTestclient.exeを使用してWCF(dll)を起動できるのは奇妙だと思います。Windowsサービスホスト(exe)で実行しようとしたときだけでなく、設定ファイルに何か問題がある場合は、そこでも失敗するはずでした。「ビット」が失われたように聞こえた場合は申し訳ありませんが、残念ながらWCFとサービス期間の初心者です。他に何か提案はありますか?
user280626

9

App.configファイルをサービスプロジェクトからコンソールホストアプリケーションにコピーしてここに貼り付け、サービスプロジェクトから削除するだけです。


5

プログラムで追加すると、より詳細な例外が発生しました- AddServiceEndpoint

string baseAddress = "http://" + Environment.MachineName + ":8000/Service";
ServiceHost host = new ServiceHost(typeof(Service), new Uri(baseAddress));  

host.AddServiceEndpoint(typeof(MyNamespace.IService),
                        new BasicHttpBinding(), baseAddress);
host.Open();

1
ありがとう!この方法でアドレスを渡すと、例外の詳細がわかりました。私の場合、ポートは別のプロセスで使用されていただけです:)
Hernan Veiras

同じ問題があります。ベースアドレスは、サービス参照の追加で[検出]をクリックしたときのアドレスと同じですか。
ZoomVirus

4

WCFの構成を準備するのは困難であり、サービスタイプの定義が気付かれない場合があります。

サービスタグには名前空間のみを記述したため、同じエラーが発生しました。

<service name="ServiceNameSpace">

忘れないでください。サービスタグには完全修飾サービスクラス名が必要です。

<service name="ServiceNameSpace.ServiceClass">

私のような他の人々のために。


1
4年前にここで答えたみたいですか?
SteveCav 2016年

それらは同じに見えますが、1つの違いがあります。あなたの間違ったサンプルはクラス名(TechResponse)だけを書くことですが、私の名前空間(ServiceNameSpace)だけを書いています。
UğurAldanmaz

4

今日私は同じ問題に出くわしました、ここに私の間違いを投稿し、誰かを助けるためにそれを修正しました。

コードを再構築しているときに、実際にサービスクラスとIServiceの名前を変更し、ServiceHostをこの新しいサービスクラス名(コードスニペットに示すように)を指すように変更しましたが、ホストアプリケーションのApp.Configファイルでまだ古いサービスクラス名を使用していました。(以下のスニペットの設定セクションの名前フィールドを参照してください)

これがコードスニペットです。

 ServiceHost myServiceHost = new ServiceHost(typeof(NewServiceClassName)); 

セクションのサービスの下のApp.configファイルで、古いサービスクラス名を参照していましたが、新しいServiceClassNameに変更して問題を修正しました。

  <service name="ProjectName.OldServiceClassName"> 
        <endpoint address="" binding="basicHttpBinding" contract="ProjectName.IService">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress=""/>
          </baseAddresses>
        </host>
      </service>

こっちも一緒。クラスと契約名の大文字と小文字を変更すると、すべてが機能しました。ありがとう。
Chazaq 2018年

3

私も同じ問題を抱えていました。すべてがVS2010で機能しますが、VS2008で同じプロジェクトを実行すると、上記の例外が発生します。

VS2008プロジェクトで機能させるために行ったのはAddServiceEndpoint、ServiceHostオブジェクトのメンバーに呼び出しを追加することでした。

これが私のコードスニペットです:

Uri baseAddress = new Uri("http://localhost:8195/v2/SystemCallbackListener");

ServiceHost host = new ServiceHost(typeof(SystemCallbackListenerImpl), baseAddress);

host.AddServiceEndpoint(typeof(CsfServiceReference.SystemCallbackListener),
                        new BasicHttpBinding(),
                        baseAddress);
host.Open();

app.configファイルは変更しませんでした。ただし、サービスエンドポイントも.configファイルに追加されている可能性があります。


このメソッドを使用すると、addServiceReferanceアドレスにこのアドレスを使用できますが、AddressAccessDeniedExceptionが発生します。
ZoomVirus

2

私は自分のサービスでこの問題に取り組みました。これが私が受け取っていたエラーです:

サービス「EmailSender.Wcf.EmailService」には、アプリケーション(インフラストラクチャでない)エンドポイントがありません。これは、アプリケーションの構成ファイルが見つからなかったか、構成ファイルでサービス名と一致するサービス要素が見つからなかったか、サービス要素でエンドポイントが定義されていなかったことが原因である可能性があります。

これを修正するために使用した2つの手順は次のとおりです。

  1. 正しい完全修飾クラス名を使用します。

    <service behaviorConfiguration="DefaultBehavior" name="EmailSender.Wcf.EmailService">
  2. エンドポイントをmexHttpBindingで有効にします。最も重要なのは、IMetadataExchangeコントラクトを使用することです。

    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>

2

このエラーは、WCFサービスのホスティングアプリケーションの構成ファイルに適切な構成がない場合に発生します。

設定からのこのコメントを覚えておいてください:

サービスライブラリプロジェクトをデプロイするときは、構成ファイルのコンテンツをホストのapp.configファイルに追加する必要があります。System.Configurationは、ライブラリの構成ファイルをサポートしていません。

IISでホストされているWCFサービスがある場合、VS.NETを介したランタイム中に、サービスライブラリプロジェクトのapp.configを読み取りますが、デプロイされるとホストのweb.configを読み取ります。web.configに同じ<system.serviceModel>設定がない場合、このエラーが発生します。完成したら、必ずapp.configから構成をコピーしてください。


2

私はこの問題に遭遇し、上記のすべての回答をチェックして、明らかなものがないことを確認しました。さて、私は半明白な問題を抱えていました。コード内のクラス名の大文字と小文字、および構成ファイルで使用したクラス名が一致しませんでした。

例:クラス名がCalculatorServiceで、構成ファイルがCalculatorserviceを参照している場合、このエラーが発生します。


ちょうど同じことを経験しました。特に大規模なコードベースをリファクタリングする場合は、見つけるのが難しい場合があります。移動するときは、WCF構成の名前空間を更新することを忘れないでください。
Arve Systad

2

私はVisual Studioを管理者モードで実行しましたが、それは私にとってはうまくいきました:)また、WCF構成の書き込みに使用しているapp.configファイルが、実際のWCFサービスではなく、「ServiceHost」クラスが使用されているプロジェクトにあることを確認してください。事業。


これにより、多くの時間を節約できました。:)
Parag

1

私の問題は、.svcファイルのデフォルトのService1クラスの名前をより意味のある名前に変更したときに、web.configの動作とエンドポイントが古い命名規則に対応するようになったことです。web.configを修正してみてください。


1

コンソールアプリケーションを使用してWCFサービスをホストする場合に覚えておくべき重要なことの1つは、WCFプロジェクトのWeb.configファイルが完全に無視されることです。system.serviceModel構成がある場合は、その構成のセクションをコンソールプロジェクトのApp.configに移動する必要があります。

これは、名前空間が正しい場所で指定されていることを確認するための回答に追加されます。


1

別の手がかりとして、それは確かに私の場合この問題を修正しました。

一部のWCFサービスをコンソールアプリケーション(コードで構成されたいくつかのWCFサービス)からAzure WebRoleに移行して、それらをAzureで公開しています。新しいサービスを追加するたびに、VSはweb.configを編集し、次の行を追加します。

<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">

さて、上記のすべてのアドバイスと回答では、serviceHostingEnvironment要素のすべての属性を削除するまで機能させることができませんでした。ご覧のとおり、私はWCFのロックスターではありませんが、次のように構成するだけで、最初のサービスで動作するようにしました。

<service name="FirstService" behaviorConfiguration="metadataBehavior">
                <endpoint address=""
                 binding="wsHttpBinding"
                 bindingConfiguration="WSHttpBinding_WcfServicesBinding"
                 contract="IFirstService" />

            </service>

しかし、2番目のサービスを追加すると、サービスが停止し、これらの属性が再び存在することに気付きました。

時間の節約になれば幸いです。


0

作成したWCFサービスライブラリがホスティング用に接続されていないが、接続用に接続されている場合、Windowsサービスでこのエラーが発生しました。エンドポイントがありませんでした。(他の接続にWCFサービスを提供できるように、またWindowsサービスのメインプロセスでタイマー/スケジュールでさまざまなタスクを実行できるように、Windowsサービスでの接続とホスティングの両方が必要でした。)

修正は、App.configファイルを右クリックし、[WCF構成の編集]を選択したことです。次に、サービスの作成の手順を実行して、WCFサービスに接続できるようにしました。現在、App.configには1つだけでなく2つのエンドポイントがありました。1つのエンドポイントはWCFサービスライブラリへの接続用であり、もう1つのエンドポイントはそのホスティング用でした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.