Подтвердить что ты не робот

"Не удалось найти элемент конечной точки с именем..."

Извините за долгое выражение о проблеме... Я провел две недели отладки и много заметок...

У меня есть служба данных 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>
  • В папке 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.

Любые идеи, что происходит? Я довольно сильно измучил Google.: - (

4b9b3361

Ответ 1

решаемые

Оказывается, у нас есть exe, который загружает DLL. 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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

Приветствия!!!!!!!!!

Ответ 5

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

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

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

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

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

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