"Не удалось найти элемент конечной точки с именем ..." - PullRequest
12 голосов
/ 06 июля 2010

Извините за длинную формулировку проблемы ... Я потратил два дня на отладку и у меня много записей ...

У меня есть служба данных WCF и другой процесс, пытающийся подключиться к нему в качестве клиента через TCP и / или HTTP.

У меня ОЧЕНЬ простое тестовое клиентское приложение, которое, кажется, нормально подключается, но более сложное производственное приложение не может подключиться (ни TCP, ни HTTP). В обоих клиентских проектах я позволил Visual Studio 2008 сгенерировать 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>
  • В папке bin \ Debug \ MyServer находится MyServer.exe, app.config.

  • В корзине MyDataSeriviceHost \ 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.

Есть идеи, что происходит? Я в значительной степени исчерпал Google. : - (

Ответы [ 5 ]

18 голосов
/ 07 июля 2010

решаемые

Оказывается, у нас есть exe, который загружает DLL. DLL содержит клиент WCF. После компиляции генерируется MyServer.dll.config, но, поскольку исполняемый файл является собственным (не .NET), он не считывает файл .config автоматически. Нам нужно сделать это вручную. Эта ссылка позволила мне загрузить конфигурацию вручную и создать CustomChannelFactory <> для решения этого вопроса.

Для тех, кому нужно то же самое, вот ссылка, которая привела к решению: http://www.paraesthesia.com/archive/2008/11/26/reading-wcf-configuration-from-a-custom-location.aspx

5 голосов
/ 11 августа 2011

У меня была такая ситуация, когда у меня была

  • Служба WCF, размещенная где-то
  • Основной проект
  • Потребительский проект типа 'библиотека классов', который имеетСсылка службы на службу WCF
  • Основной проект вызывает методы из потребительского проекта

Теперь у проекта Consumer были все связанные параметры конфигурации в <system.serviceModel> Теге моего app.config, еговсе еще выдавал ту же ошибку, что и выше.

Все, что я сделал, это добавил тот же тег <system.serviceModel> в файл app.config моего основного проекта, и, наконец, мы были в порядке.

Реальная проблема, так как в моем случае это было чтение неправильного файла конфигурации.Вместо app.config потребителя он ссылался на конфигурацию основного проекта.Мне понадобилось два часа, чтобы понять это.

3 голосов
/ 06 июля 2010

Может быть, именно так, как вы его написали, но, похоже, ваш файл конфигурации не копируется в каталог правильно. Оно должно иметь подходящее имя для вашего приложения, а не app.config. Если вы попытаетесь изменить имя файла app.config на [exe name] .exe.config, это поможет.

1 голос
/ 04 марта 2013

Когда EXE-файл использует DLL, файл конфигурации, который он ищет, не является DLLName.Dll.Config его EXEName.exe.config, измените имя сгенерированного файла конфигурации и скопируйте его в путь выполнения.Это должно работать.

Ура !!! !!!!!!!!!

0 голосов
/ 12 июля 2017

Аналогичная ситуация с другим решением, которое может быть полезно в следующих случаях:

  • Как и приведенные выше посты, у меня есть EXE-клиент, определенный в DLL.

  • В отличие от вышеописанной ситуации, мой Клиент использует UDP-зонд для обнаружение конечных точек службы (очевидно, что служба имеет включенный MEX)

ClientProxy наследует DuplexClientBase , а перегруженный метод создания экземпляров позволяет указывать привязку и конечную точку без использования ЛЮБЫХ файлов конфигурации.

В примере с VB я обнаружил конечную точку (ep) и знаю, что привязка - это TCP с отключенной защитой, поэтому я могу создать экземпляр клиента callback и использовать его как:

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