Моя клиентская сторона wcf показывает исключение, но WcfTestClient Tool работает нормально - PullRequest
0 голосов
/ 24 апреля 2019

Я кодировал сторону сервера WCF с помощью netTcpBinding. Затем я закодировал клиентскую сторону. Но это показывает исключение, в то время как оправдание "var sc = new CommondServiceClient ();" во время выполнения. Что мне делать?

Ниже приведено сообщение об исключении:

System.InvalidOperationException HResult = 0x80131509 Сообщение = Не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт «ICommondService» в разделе конфигурации клиента ServiceModel. Это может быть связано с тем, что для вашего приложения не найден файл конфигурации, или из-за того, что в клиентском элементе не найден элемент конечной точки, соответствующий этому контракту. Источник = System.ServiceModel Трассировки стека: ......

Я что-то пробовал:

  1. Я могу использовать сервисы с помощью WcfTestClient.
  2. Ссылка на услугу добавлена ​​Visual Studio "Добавить ссылку на услугу ...". Я думаю, что я получаю сервисные данные. Но я встречаю исключение времени выполнения, как указано выше
  3. Я также пытался сгенерировать код с помощью инструмента svcutil, но он все еще не работает

Вот файл конфигурации wcf:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <!-- When deploying the service library project, the content of the config file must be added to the host's 
  app.config file. System.Configuration does not support config files for libraries. -->
  <system.serviceModel>
    <services>
      <service name="ServiceContractor.CommondService">
        <endpoint address="" binding="netTcpBinding" contract="ServiceContractor.ICommondService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
       </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- To avoid disclosing metadata information, 
          set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="False" httpsGetEnabled="False"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

</configuration>

Это wcf-сервис с собственным хостом:

            var baseAddress = new Uri($"net.tcp://localhost:{PORT}/Company/service");
            _host = new ServiceHost(typeof(CommondService), baseAddress);
            try
            {
                var smb = _host.Description.Behaviors.Find<ServiceMetadataBehavior>();
                if (smb == null) _host.Description.Behaviors.Add(new ServiceMetadataBehavior());
                _host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
                _host.AddServiceEndpoint(typeof(ICommondService), new NetTcpBinding(), "");

                _host.Open();
            }
            catch (CommunicationException ce)
            {
                _host.Abort();
            }

Понятия не имею, что не так. Какой документ мне следует попросить? Вы можете мне помочь?

1 Ответ

0 голосов
/ 25 апреля 2019

Но у меня сейчас другой вопрос. Можно ли избавиться от конфигурации. Так что приложению просто нужна DLL, и она ничего не знает о службе WCF.

Вообще говоря, существует два способа вызова службы WCF (службы Soap) в веб-приложении.

  • Создать клиентский прокси-класс, добавив ссылку на службу, таким образом Обычно необходимо настроить параметры службы в конфигурации файл (web.config), большая часть служебной информации должна быть хранится в файле конфигурации. Для проекта библиотеки классов у нас есть перенести конфигурацию в файл конфигурации фактического проект.
    https://docs.microsoft.com/en-us/dotnet/framework/wcf/accessing-services-using-a-wcf-client
  • Используйте ChannelFactory для создания канала связи, мы установили до конфигурации услуг программно. От твоего описание, этот способ вызова веб-службы может быть подходящее решение. Настройте конфигурацию сервиса программно в коде. Следует отметить, что все конфигурация сервиса жестко запрограммирована, например, тип привязки и сервис информация о конечной точке. Вы можете сослаться на следующие документы.

https://docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/how-to-use-the-channelfactory Не стесняйтесь, дайте мне знать, если есть что-то, с чем я могу помочь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...