web-dev-qa-db-ja.com

「名前の付いたエンドポイント要素が見つかりませんでした...」

長い問題の説明をお詫びします...私は2日間デバッグに費やし、たくさんのメモがあります...

WCFデータサービスと、TCPおよび/またはHTTPを介してクライアントとして接続しようとしている別のプロセスがあります。

正常に接続されているように見える非常に単純なテストクライアントアプリがありますが、より複雑な本番アプリは接続できません(TCPまたはHTTP))。両方のクライアントプロジェクトで、Visual Studio2008に「サービス参照の追加」を使用してapp.configにデータサービスからメタデータをプルさせます。

動作する単純なテストクライアントのコードは次のとおりです。

using Client.MyDataService;

namespace Client
{
    class Program
    {
        static void Main(string[] args)
        {
            MyDataServiceClient client = new MyDataServiceClient("net.tcp");

            client.GetRecords();
        }
    }
}

より複雑な本番クライアントのコードは次のとおりです。

DataServiceManager.cs:

using MyServer.MyDataService;

namespace MyServer.DataServiceBridge
{
    class DataServiceManager
    {
        MyDataServiceClient dataServiceClient = new MyDataServiceClient("net.tcp");
}
}

メインプロセス:

DataServiceManager d = new DataServiceManager();

シンプルクライアントと本番クライアントの両方のapp.configファイルは次のとおりです。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
        <bindings>
            <netTcpBinding>
                <binding name="net.tcp" closeTimeout="00:01:00" openTimeout="00:01:00"
                    receiveTimeout="00:10:00" sendTimeout="00:01:00" transactionFlow="false"
                    transferMode="Buffered" transactionProtocol="OleTransactions"
                    hostNameComparisonMode="StrongWildcard" listenBacklog="10"
                    maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
                    maxReceivedMessageSize="65536">
                    <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
                    <reliableSession ordered="true" inactivityTimeout="00:10:00"
                        enabled="false" />
                    <security mode="Transport">
                        <transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
                        <message clientCredentialType="Windows" />
                    </security>
                </binding>
            </netTcpBinding>
        </bindings>
        <client>
            <endpoint address="net.tcp://localhost:8888/MyDataService"
                binding="netTcpBinding" bindingConfiguration="net.tcp" contract="MyDataService.IMyDataService"
                name="net.tcp">
                <identity>
                    <userPrincipalName value="COMPUTER_NAME\Username" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>
  • MyServerのbin\Debug \フォルダーには、MyServer.exe、app.configがあります。

  • MyDataSeriviceHostのbin\Debug \フォルダーには、MyDataService.exe、app.config、およびMyDataSeriviceHost.exe.configがあります。 app.configとMyDataSeriviceHost.exe.configは同じです。

エラーメッセージは次のとおりです。

An exception of type 'System.InvalidOperationException' occurred in System.ServiceModel.dll but 
was not handled in user code

Additional information: Could not find endpoint element with name 'net.tcp' and contract
 'MyDataService.IMyDataService' in the ServiceModel client configuration section.
 This might be because no configuration file was found for your application, or because no endpoint
 element matching this name could be found in the client element.

何が起こっているのかアイデアはありますか?私はグーグルをかなり使い果たしました。 :-(

13
CrypticPrime

解決済み

DLLをロードするexeファイルがあることがわかりました。 DLLにはWCFクライアントが含まれています。コンパイルするとMyServer.dll.configが生成されますが、exeはネイティブ(.NETではない)であるため、.configファイルは自動的に読み込まれません。手動で行う必要があります。このリンクを使用すると、構成を手動でロードし、CustomChannelFactory <>を作成してこの質問を解決できました。

同じことを必要としている他の人のために、ここに解決策につながったリンクがあります: http://www.paraesthesia.com/archive/2008/11/26/reading-wcf-configuration-from-a- custom-location.aspx

19
CrypticPrime

私はこのような状況にありました

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

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

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

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

5
Bravo

あなたがそれを書いた方法かもしれませんが、あなたの設定ファイルがディレクトリに正しくコピーされていないようです。 app.configではなく、アプリケーションと一致する名前を付ける必要があります。 app.configファイルの名前を[exe名]に変更しようとすると、.exe.configが役に立ちます。

3
spinon

EXEがDLL検索する構成ファイルがDLLName.Dll.ConfigのEXEName.exe.configではない場合、生成された構成ファイルの名前を変更し、実行パスにコピーします。 。動作するはずです。

乾杯!!!!!!!!!

1
Ganesh R

これらの特定の状況で役立つ可能性のある、異なるソリューションを使用した同様の状況:

  • 上記の投稿のように、DLLで定義されたEXEホスティングクライアントがあります。

  • 上記の状況とは異なり、クライアントがUDPプローブを使用してサービスエンドポイントを検出しています(明らかに、サービスでMEXが有効になっています)

ClientProxyは DuplexClientBase を継承し、オーバーロードされたインスタンス化メソッドを使用すると、構成ファイルを必要とせずにバインディングとエンドポイントを指定できます。

A VB例、エンドポイント(ep)を発見し、バインディングがTCPでセキュリティが無効になっていることを知っているので、コールバッククライアントをインスタンス化して使用できます:

myClientProxy = New ClientProxy(New InstanceContext(Me), New NetTcpBinding(SecurityMode.None), ep.Address)
0
user3085342