web-dev-qa-db-ja.com

デフォルトのエンドポイント要素が見つかりませんでした

私はVS2008/.NET 3.5ソリューションにWebサービスへのプロキシを追加しました。クライアント.NETを構築するとき、このエラーを投げます:

ServiceModelクライアント構成セクションで契約 'IMySOAPWebService'を参照するデフォルトのエンドポイント要素が見つかりませんでした。これは、ご使用のアプリケーション用の構成ファイルが見つからなかったため、またはこの規約に一致するエンドポイント要素がクライアント要素内に見つからなかったためと考えられます。

このエラーを検索すると、契約でフルネームスペースを使用するように指示されます。これは、完全な名前空間を持つ私のapp.configです。

<client>
  <endpoint address="http://192.168.100.87:7001/soap/IMySOAPWebService"
            binding="basicHttpBinding" bindingConfiguration="IMySOAPWebServicebinding"
            contract="Fusion.DataExchange.Workflows.IMySOAPWebService" name="IMySOAPWebServicePort" />
</client>

私はXP localを実行しています(Googleのヒット数がwin2k3に言及しているのでこれに言及します)app.configはapp.exe.configにコピーされるので、これも問題ではありません。

何か手がかりはありますか?

349
edosoft

いくつかのオプションをテストしたので、ついにこれを使用して解決しました

contract = "IMySOAPWebService"

つまり、設定に完全な名前空間がない。何らかの理由で、フルネームが正しく解決されませんでした

73
edosoft

「このエラーは、クラスライブラリ内のサービスを呼び出していて、別のプロジェクトからクラスライブラリを呼び出している場合に発生する可能性があります。」

この場合は、winappの場合はWS.設定をメインプロジェクトのapp.configに、Webアプリケーションの場合はweb.configに含める必要があります。これはPRISMとWPF/Silverlightでも同じ方法です。

565
L.R.

私は自分自身でバインディングとエンドポイントアドレスのインスタンスを作成することでこれを解決しました - これは設定ファイルに新しい設定を追加したくなかったからです(これは広く使われている既存のライブラリコードの置き換えです)。以前は古いWebサービスリファレンスなどを使用していたので、新しい設定をどこにも追加せずにこれをドロップインできるようにしたいと思いました。

var remoteAddress = new System.ServiceModel.EndpointAddress(_webServiceUrl);

using (var productService = new ProductClient(new System.ServiceModel.BasicHttpBinding(), remoteAddress))
{
    //set timeout
    productService.Endpoint.Binding.SendTimeout = new TimeSpan(0,0,0,_webServiceTimeout);

    //call web service method
    productResponse = productService.GetProducts();
} 

編集

Httpsを使用している場合は、BasicHttpsBindingではなくBasicHttpBindingを使用する必要があります。

77
Tom Haigh

私はこれと同じ問題を抱えています。 Web REFERENCEでは、URLをコンストラクタの最初のパラメータとして指定する必要があります。

new WebService.WebServiceSoapClient("http://myservice.com/moo.aspx");

新しいスタイルのWebサービスリファレンスの場合は、設定内のエンドポイントエントリを参照する名前を指定する必要があります。

new WebService.WebServiceSoapClient("WebServiceEndpoint");

Web.configまたはApp.configに対応するエントリがあると、

<client>
      <endpoint address="http://myservice.com/moo.aspx"
        binding="basicHttpBinding" 
        bindingConfiguration="WebService"
        contract="WebService.WebServiceSoap"
        name="WebServiceEndpoint" />
    </client>
  </system.serviceModel>

「それは古いプログラムでうまくいった」というトンネルのビジョンを取り除くのはなかなか難しいです….

54
Andomar

私はこのような状況を経験した

  • どこかでホストされているWCFサービス
  • 主なプロジェクト
  • WCFサービスへのサービス参照を持つタイプ「クラスライブラリ」のコンシューマプロジェクト
  • メインプロジェクトがコンシューマプロジェクトからメソッドを呼び出す

これで、Consumerプロジェクトは私のapp.configの<system.serviceModel>タグに関連する設定をすべて持っていましたが、それでもまだ上記と同じエラーが発生しました。

私のメインプロジェクトのapp.configファイルに同じタグ<system.serviceModel>を追加しただけなので、最後に行って良かったです。

私の場合と同じくらい本当の問題は、それは間違った設定ファイルを読んでいました。消費者のapp.configの代わりに、メインのprojの設定を参照していました。それを理解するのに2時間かかりました。

16
Bravo

「このエラーは、クラスライブラリ内のサービスを呼び出していて、別のプロジェクトからクラスライブラリを呼び出している場合に発生する可能性があります。」

「この場合は、winappの場合はWS.設定、メインアプリケーションのapp.configに含める必要があります。Webアプリケーションの場合はweb.configに設定する必要があります。これはPRISMおよびWPF/Silverlightでも有効な方法です」

はい。ただし、メインプロジェクト(たとえばOrchard CMS)を変更できない場合は、WCFサービス設定をプロジェクト内に保持できます。

クライアント生成メソッドでサービスヘルパーを作成する必要があります。

public static class ServiceClientHelper
{
    public static T GetClient<T>(string moduleName) where T : IClientChannel
    {
        var channelType = typeof(T);
        var contractType = channelType.GetInterfaces().First(i => i.Namespace == channelType.Namespace);
        var contractAttribute = contractType.GetCustomAttributes(typeof(ServiceContractAttribute), false).First() as ServiceContractAttribute;

        if (contractAttribute == null)
            throw new Exception("contractAttribute not configured");

        //path to your lib app.config (mark as "Copy Always" in properties)
        var configPath = HostingEnvironment.MapPath(String.Format("~/Modules/{0}/bin/{0}.dll.config", moduleName)); 

        var configuration = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = configPath }, ConfigurationUserLevel.None);
        var serviceModelSectionGroup = ServiceModelSectionGroup.GetSectionGroup(configuration);

        if (serviceModelSectionGroup == null)
            throw new Exception("serviceModelSectionGroup not configured");

        var endpoint = serviceModelSectionGroup.Client.Endpoints.OfType<ChannelEndpointElement>().First(e => e.Contract == contractAttribute.ConfigurationName);
        var channelFactory = new ConfigurationChannelFactory<T>(endpoint.Name, configuration, null);
        var client = channelFactory.CreateChannel();
        return client;
    }
}

そしてそれを使う:

using (var client = ServiceClientHelper.GetClient<IDefaultNameServiceChannel>(yourLibName)) {
                ... get data from service ...
            }

この記事の の詳細を参照してください

13
melvas

これは私を狂わせた。

Silverlight 3 Prism(CAB)とWCFを使用しています

PrismモジュールでWCFサービスを呼び出すと、同じエラーが発生します。

サービスモデルクライアントの設定セクションで、契約 'IMyService'を参照するデフォルトのエンドポイント要素が見つかりませんでした。これは、ご使用のアプリケーション用の構成ファイルが見つからなかったか、この契約に一致するエンドポイント要素がクライアント要素に見つからなかったことが原因である可能性があります。

これは、モジュールのServiceReferences.ClientConfigファイルではなく、ServiceReferences.ClientConfigファイルをシェルの.xapファイルで検索した結果です。私は自分のエンドポイントを追加し、私のSilverlight Shellアプリケーションの既存のServiceReferences.ClientConfigファイルにバインドしました(それはそれ自身のWCFサービスを呼び出します)。

それから私は自分のWebプロジェクトのClientBinフォルダのための新しい.xapファイルを生成するためにShellアプリを再構築しなければなりませんでした。

これで、このコード行はようやく機能します。

MyServiceClient myService = new MyServiceClient();
12
Jeff Moeller

ここでは、クラスファイルからサービスを参照するという曖昧な曖昧なエラーに直面したときに、いくつかの回答が正しい解決策を示しています。コンソールまたはWindowsアプリケーションのapp.config web.configにservice config infoをコピーします。しかし、それらの答えのどれもコピーするものをあなたに示しているようには見えません。それを試して修正しましょう。

これは、私が "TranslationServiceOutbound"と呼ぶサービスに対するこのクレイジーなエラーを回避するために、クラスライブラリの設定ファイルからコンソールアプリケーションの設定ファイルにコピーしたものです。

あなたは基本的にsystem.serviceModelセクションの中にすべてが欲しいのです:

  <system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_ITranslationServiceOutbound" />
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://MyHostName/TranslationServiceOutbound/TranslationServiceOutbound.svc"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ITranslationServiceOutbound"
    contract="TranslationService.ITranslationServiceOutbound" name="BasicHttpBinding_ITranslationServiceOutbound" />
</client>
12
markaaronky

WCFサービスがbinフォルダ内の参照された.dllファイルとしてASP.NETアプリケーションに追加されているクラスライブラリに追加されていたASP.NETアプリケーション内でこのエラーが発生していました。エラーを解決するには、WCFサービスを参照しているクラスライブラリ内のapp.configファイルの設定を、ASP.NETサイト/アプリのweb.config設定にコピーする必要がありました。

11
zanderwel

私は、クラスライブラリインタフェースを使用していたときにクライアントUIのApp.configにコピーするのと同様に、サービス参照の名前をバインディングの名前の前に付ける必要がありました(以下の私のものはServiceReferenceです)。

例えば。:

<endpoint address="http://localhost:4000/ServiceName" binding="basicHttpBinding"
      bindingConfiguration="BasicHttpBinding_ISchedulerService"
      contract="ServiceReference.ISchedulerService" 
      name="BasicHttpBinding_ISchedulerService" />

生成されたデフォルトの代わりに:

<endpoint address="http://localhost:4000/ServiceName" binding="basicHttpBinding"
      bindingConfiguration="BasicHttpBinding_ISchedulerService"
      contract="ISchedulerService" 
      name="BasicHttpBinding_ISchedulerService" />
9
Matt Mitchell

私は同じ問題を抱えていましたが、契約の名前空間を変更してもうまくいきませんでした。それで、私は.Net 3.5サービス参照の代わりに.Net 2スタイルWeb参照を試しました。それはうまくいった。

Visual Studio 2008でWeb参照を使用するには、[サービス参照の追加]をクリックし、ダイアログボックスが表示されたら[詳細設定]をクリックします。その点では、サービス参照の代わりにWeb参照を使用できるようにするオプションがあります。

7
Cyril Gupta

私は単体テストで状況があります。 app.configファイルを単体テストプロジェクトにコピーしました。そのため、単体テストプロジェクトにはエンドポイント情報も含まれています。

6
user1108948

サービスを消費する非ライブラリアプリケーションを単体テストすると、この問題が発生する可能性があります。

他の人が入力した情報がこれの根本的な原因に対処します。自動テストケースを作成しようとしていて、テストしているユニットが実際にサービスインターフェイスを呼び出す場合は、テストプロジェクトにサービス参照を追加する必要があります。これは、ライブラリタイプのエラーを使用するアプリケーションの一種です。インターフェイスを消費するコードはライブラリには含まれていないため、私はすぐにはわかりませんでした。ただし、実際にテストを実行すると、テスト対象のアセンブリではなくテストアセンブリから実行されます。

ユニットテストプロジェクトにサービス参照を追加することで私の問題は解決しました。

6
PatrickV

私はこの問題に一度直面しました。私はまだWCFサービスを使用するインターフェースを開発していたからです。テストアプリケーションを設定し、開発を続けました。それから開発中に、私はいくつかのサービスの名前空間を変更しました。だから私はWCFクラスに一致するようにweb.configで "system.serviceModel - > client - > endpoint - > contract"を二重チェックした。それで問題は解決します。

4
vardars

同じ問題を抱えている人のためだけに。私は自分のサービスに接続しようとする私の方法のためのユニットテストを書きました。毎回これと同じ例外が発生して失敗しました - 私はその理由を知りません。私がwinformからそれを実行したとき、それはうまく機能します。

3
PhilG

あなたの設定の名前空間はあなたのクライアントのデフォルト名前空間の後の名前空間パスの残りを反映するべきです(プロジェクトプロパティで設定されているように)。あなたの投稿された回答に基づいて、私の推測はあなたのクライアントが "Fusion.DataExchange.Workflows"名前空間に入るように設定されているということです。クライアントコードを別のネームスペースに移動した場合は、残りのネームスペースパスと一致するように設定を更新する必要があります。

3
Chris Porter

同じ問題があります。クラスライブラリでWCFサービスを使用し、Windowsアプリケーションプロジェクトからクラスライブラリを呼び出していますが、Windowsアプリケーションプロジェクトの構成ファイルの変更<system.serviceModel>を忘れていますクラスライブラリのapp.Configファイルの<system.serviceModel>と同じです。
解決策:クラスライブラリのwcf構成と同じ外部プロジェクトの構成を変更します。

こんにちは私は同じ問題に遭遇しましたが、最善の解決策は.NETにあなたのクライアント側の設定を設定させることです。 http:/namespace/service.svcのクエリ文字列を使用してサービス参照を追加すると、これがわかりますか?wsdl = wsdl0クライアント側で構成エンドポイントを作成しません。しかし、?wsdl-wsdl0を削除してhttp:/namespace/service.svcというURLだけを使用すると、クライアント構成ファイルにエンドポイント構成が作成されます。簡単に言うと、 "?WSDL = WSDL0"です。

2
Joey

サービスクライアント宣言行をクラスフィールドとして配置しないでください。これではなく、で使用した各メソッドでインスタンスを作成します。そのため、問題は修正されます。クラスフィールドとしてサービスクライアントインスタンスを作成すると、設計時エラーが発生します。

2
Mücahid Uslu

PRISMフレームワークを使用してWPFアプリケーションを使用している場合、構成は起動プロジェクト(つまり、ブートストラップが存在するプロジェクト)に存在するはずです。

2
VRK

クラスライブラリでWebサービスを参照する場合は、app.configをWindowsアプリケーションまたはコンソールアプリケーションにコピーする必要があります。

解決策:外部プロジェクトの構成をクラスライブラリのwcf構成と同じに変更します。

私のために働いた

2
Roshan

この問題を作成/修正するにはいくつかの方法があるようです。私にとっては、私が使用しているCRM製品はネイティブコードで書かれていて、私の.NET dllを呼び出すことができますが、メインアプリケーションの上にある必要がある設定情報に遭遇します。私にとっては、CRMアプリケーションは.NETではないので、それを自分のmachine.configファイルに入れなければならなくなりました(必要な場所ではありません)。さらに、私の会社はWebsenseを使用しているので、407 Proxy Authentication Requiredの問題のためにService Referenceを追加することすら難しく、machine.congの修正が必要でした。

プロキシソリューション:

WCFサービスリファレンスを機能させるには、私のDLLのapp.configからメインのアプリケーション設定に情報をコピーする必要がありました(私にとってはmachine.configでした)。また、エンドポイント情報も同じファイルにコピーする必要がありました。一度それをやったらそれは私のために働き始めました。

1
TPaul

私は同じ問題を抱えていた
デスクトップアプリを使用していて、Global Weather Webサービスを使用していました

サービス参照を削除し、Web参照を追加して問題を解決しましたThanks

1
Kamran Akhter

このエラーは、クラスライブラリでサービスを呼び出していて、別のプロジェクトからクラスライブラリを呼び出している場合に発生する可能性があります。

1
Manuel Alves

グローバルスコープ演算子なしで設定ファイル要素の契約を参照していたときにこのエラーが発生しました。

すなわち.

<endpoint contract="global::MyNamepsace.IMyContract" .../>

動作しますが、

<endpoint contract="MyNamepsace.IMyContract" .../>

「コントラクトを参照するデフォルトのエンドポイント要素が見つかりませんでした」というエラーが表示されます。

MyNamepsace.IMyContractを含むアセンブリはメインアプリケーションとは異なるアセンブリ内にあるため、これはグローバルスコープ解決を使用する必要性を説明するかもしれません。

1
saille

私が探すべきもう一つのことを付け加えるようにしなさい。 ( Tom Haighの の答えはすでにそれを暗示していますが、私は明確にしたいです)

私のweb.configファイルには、以下が定義されています。

<protocolMapping>
    <add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>

1つの参照に既にbasicHttpsBindingを使用していましたが、その後、basicHttpBindingを必要とする新しい参照を追加しました(no s)。私がしなければならなかったのは、次のようにそれを私のprotocolMappingに追加することだけでした。

<protocolMapping>
    <add binding="basicHttpBinding" scheme="http" />
    <add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>

L.R。 が正しく指摘しているように、これは正しい場所で定義する必要があります。私にとっては、これは私の単体テストプロジェクトのapp.configとメインサービスプロジェクトのweb.configの1つを意味します。

1
David

私は私の "契約"がプロジェクト全体で同じではないことに気づいた、私は同じエラーが発生し、私はいくつかのことを試みたが、うまくいきませんでした。これはプロジェクトAです

<client>
    <endpoint address="https://xxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="ServiceReference.IIntegrationService" name="basic" />
</client>

プロジェクトB:

<client>
    <endpoint address="xxxxxxxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="ServiceReference1.IIntegrationService" name="basic" />
</client>

最後に私は両方のために変更しました:

<client>
    <endpoint address="https://xxxxxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="MyServiceReferrence.IIntegrationService" name="basic" />
</client>
1
nzrytmn

私にとっての解決策はクライアントweb.configのEndpoint Name属性からエンドポイント名を削除することでしたこれはプロキシが使用することを可能にしました

ChannelFactory<TService> _channelFactory = new ChannelFactory<TService>("");

一日中作業するだけでした。また、最初のエラーが表示されたときに間違っていたにもかかわらず、この修正が適用されると契約名も間違っていました。契約名文字列の人々のための二重そして三重のチェック!属性:イアン

1
rob

OK。私のケースは少し異なっていました、しかし、ついに私はそれのための修正を見つけました:私はConsole.EXEを持っています - > DLL - > WS1の呼び出し - > DLL - > WS2の呼び出し

推奨どおり、Console.EXE.configにWS1とWS2のサービスモデルの両方の設定があります。 - 問題を解決しませんでした。

ただし、WS2にWS2のWebReferenceも追加するまで、DLLだけでなく、まだ機能しませんでした。実際にはWS2のプロキシを作成して呼び出す。

1
Itay Levin

サービス参照を追加しているとき

enter image description here

入力している名前空間に注意してください。

enter image description here

あなたはあなたのインターフェースの名前にそれを追加するべきです:

<client>
  <endpoint address="http://192.168.100.87:7001/soap/IMySOAPWebService"
            binding="basicHttpBinding" 
            contract="MyNamespace.IMySOAPWebService" />
</client>

私の場合は、このサービスをフレームワークプロジェクトから参照していました。セクションをメインのスタートアッププロジェクトの設定にコピーすると、問題は解決しました。

0
Nikhil Dinesh

私は同じ問題を抱えていました、そしてそれはホストアプリケーションとそのエンドポイントを使用したdllが同じサービス参照名を持っていたときにだけ解決されました。

0
silver