380

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ローカルを実行しています(これについて言及するのは、多くのGoogleヒットがwin2k3に言及しているためです)app.configはapp.exe.configにコピーされるため、これも問題ではありません。

手がかりはありますか?

4

34 に答える 34

608

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

この場合、WS 構成設定をメイン プロジェクトの app.config (winapp の場合) または web.config (Web アプリの場合) に含める必要があります。これは、PRISM と WPF/Silverlight を使用する方法でもあります。

于 2010-04-29T13:18:41.840 に答える
94

バインディングとエンドポイント アドレスのインスタンスを自分で作成することで、これを解決しました (他の人が示唆していると思います)。構成ファイルに新しい設定を追加したくなかったからです (これは、広く使用されている既存のライブラリ コードの代わりであり、以前は古い 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.

于 2011-06-16T08:57:00.913 に答える
80

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

コントラクト="IMySOAPWebService"

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

于 2008-12-10T13:19:45.783 に答える
59

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

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

新しいスタイルの Web SERVICE REFERENCE の場合、構成内のエンドポイント エントリを参照する名前を指定する必要があります。

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>

「古いプログラムでは機能していた」というトンネルビジョンを削除するのはかなり難しいです...

于 2010-06-10T17:44:39.880 に答える
17

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

「この場合、WS 構成設定をメイン プロジェクト app.config (winapp の場合) または web.config (Web アプリの場合) に含める必要があります。これは、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 ...
            }

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

于 2014-12-05T07:06:57.910 に答える
17

私が持っていたこのような状況がありました

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

これで、Consumer プロジェクトの app.config のタグに関連する構成設定がすべて含まれるように<system.serviceModel>なりましたが、上記と同じエラーがスローされていました。

私がしたことは<system.serviceModel>、メイン プロジェクトの app.config ファイルに同じタグを追加しただけで、ようやく準備が整いました。

私の場合の本当の問題は、間違った構成ファイルを読み取っていたことです。コンシューマーの app.config の代わりに、メイン プロジェクトの構成を参照していました。それを理解するのに2時間かかりました。

于 2011-08-11T05:03:32.067 に答える
15

これは私を夢中にさせました。

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

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

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

モジュールの ServiceReferences.ClientConfig ファイルではなく、シェルの .xap ファイルで ServiceReferences.ClientConfig ファイルを検索していることがわかります。Silverlight シェル アプリケーションの既存の ServiceReferences.ClientConfig ファイルにエンドポイントとバインディングを追加しました (独自の WCF サービスを呼び出します)。

次に、Shell アプリを再構築して、Web プロジェクトの ClientBin フォルダー用の新しい .xap ファイルを生成する必要がありました。

これで、このコード行が最終的に機能します。

MyServiceClient myService = new MyServiceClient();
于 2009-10-15T18:57:48.327 に答える
10

クラス ライブラリ インターフェイスを使用していたので、クライアント 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" />
于 2010-10-30T11:14:43.283 に答える
9

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

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

単体テストプロジェクトにサービス参照を追加すると、問題が解決しました。

于 2012-02-14T23:31:27.137 に答える
8

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

于 2015-09-23T13:16:45.580 に答える
5

私は一度この問題に直面しました。それは、WCF サービスを使用するインターフェイスをまだ開発中であったためです。テスト アプリケーションを構成し、開発を続けました。その後、開発中に、いくつかのサービスの名前空間を変更しました。そのため、web.config で「system.serviceModel -> クライアント -> エンドポイント -> コントラクト」をダブルチェックして、WCF クラスと一致させました。その後、問題は解決しました。

于 2012-09-22T12:25:58.383 に答える
4

構成内の名前空間は、クライアントのデフォルトの名前空間の後の残りの名前空間パスを反映する必要があります (プロジェクト プロパティで構成されているとおり)。投稿された回答に基づいて、クライアントは「Fusion.DataExchange.Workflows」名前空間にあるように構成されていると思います。クライアント コードを別の名前空間に移動した場合は、残りの名前空間パスに一致するように構成を更新する必要があります。

于 2008-12-10T15:54:36.750 に答える
3

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

于 2010-06-14T13:16:52.973 に答える
3

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

于 2012-08-29T20:49:34.297 に答える
3

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

于 2011-07-31T22:04:01.357 に答える
3

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

于 2010-04-15T12:10:06.147 に答える
3

サービスクライアント宣言行をクラスフィールドとして置かず、代わりに、使用される各メソッドでインスタンスを作成します。これにより、問題が修正されます。サービス クライアント インスタンスをクラス フィールドとして作成すると、設計時エラーが発生します。

于 2011-07-11T14:16:40.153 に答える
2

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

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

一日中運動するだけでした。また、この修正が行われると、最初のエラーが表示されたときに間違っていたものの、契約名が間違っていました。契約名の文字列の人々をダブルチェックしてからトリプルチェックします!! 属性:イアン

于 2011-12-23T09:37:28.707 に答える
2

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

推奨されているように、Console.EXE.configにWS1とWS2の両方のサービスモデルの構成があります。-問題を解決しませんでした。

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

于 2010-07-08T09:37:44.417 に答える
2

同じエラーが発生し、多くのことを試しましたが、機能しませんでした。私の「契約」がすべてのプロジェクトで同じではないことに気づいたので、ソリューション内のすべてのプロジェクトで同じになるように契約を変更しました。これはプロジェクト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>
于 2016-09-21T09:58:58.507 に答える
2

サービス参照を追加する場合

ここに画像の説明を入力

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

ここに画像の説明を入力

インターフェイスの名前に追加する必要があります。

<client>
  <endpoint address="http://192.168.100.87:7001/soap/IMySOAPWebService"
            binding="basicHttpBinding" 
            contract="MyNamespace.IMySOAPWebService" />
</client>
于 2016-05-31T17:35:58.500 に答える
2

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

すなわち

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

動作しますが、

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

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

MyNamepsace.IMyContract を含むアセンブリは、メイン アプリケーションとは別のアセンブリにあるため、グローバル スコープ解決を使用する必要性が説明される場合があります。

于 2014-10-29T23:07:43.703 に答える
2

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

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

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

于 2010-05-06T21:14:47.080 に答える
2

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

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

私のために働いた

于 2010-10-25T00:48:12.143 に答える
2

探しているものをもう 1 つ追加させてください。(トム・ヘイの答えはすでにそれをほのめかしていますが、私は明示したいと思います)

私の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>

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

于 2014-05-13T20:06:15.440 に答える
2


デスクトップアプリを使用していて、Global Weather Web サービスを使用し ていたのと同じ問題がありました

サービス参照を削除し、Web 参照を追加して問題を解決しました ありがとう

于 2011-11-04T12:58:29.653 に答える