94

最近、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の両方で、完全に一致します。オフィスの他の人に後ろを再確認してもらい、ある時点で目が見えなくなっていないことを確認しましたが、もちろん、すべてが正しく指定されているように見えるという同じ結論に達しました。この時点で何が起こっているのか、私は本当に途方に暮れています。誰かがこの問題について私を助けてくれますか?

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

4

17 に答える 17

98

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

 <service name="TechResponse">

なりました

 <service name="SvcClient.TechResponse">

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

于 2010-07-22T02:00:31.457 に答える
12

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

 <endpoint address="uri" binding="wsHttpBinding" contract="Namespace.Interface" />
于 2010-09-08T14:21:41.077 に答える
10

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

于 2011-02-13T01:36:38.253 に答える
9

考慮すべきことの 1 つは、WCF が WindowsService (WS) から完全に切り離されているかどうかです。WS は、多くの制御や可視性を持っていないため、苦痛を伴います。ホスト WS とは独立してテストできるように、WS 以外のものをすべて独自のクラスにすることで、これを軽減しようとしています。このアプローチを使用すると、特に WS ランタイムとサービスで発生していることをすべて排除するのに役立つ場合があります。

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

于 2010-02-24T19:36:23.803 に答える
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();
于 2013-03-20T17:36:38.100 に答える
5

WCF の構成を準備するのは難しく、サービス タイプの定義が見過ごされることがあります。

サービスタグに名前空間だけ書いたので、同じエラーになりました。

<service name="ServiceNameSpace">

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

<service name="ServiceNameSpace.ServiceClass">

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

于 2014-12-05T11:50:04.807 に答える
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 ファイルに追加されている可能性があると思います。

于 2010-09-22T12:10:40.340 に答える
2

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

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

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

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

于 2012-10-31T18:26:41.130 に答える
2

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

于 2016-02-27T17:52:41.577 に答える
2

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

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

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

  1. 正しい完全修飾クラス名を使用してください。

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

    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    
于 2011-05-23T21:18:13.243 に答える
2

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

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

于 2011-07-21T20:08:25.783 に答える
1

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

于 2011-07-05T20:06:04.313 に答える
1

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

これは、名前空間が適切な場所で指定されていることを確認することに関する回答に追加されます。

于 2016-03-18T02:07:59.503 に答える
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番目のサービスを追加すると機能しなくなり、それらの属性が再びあることに気付きました。

時間を節約できることを願っています。

于 2016-09-01T08:21:58.463 に答える