Почему я получаю ошибку времени разработки, говорящую "не удалось найти элемент конечной точки по умолчанию"? - PullRequest
0 голосов
/ 19 июня 2019

У нас есть приложение Windows Form, C #, .NET 4.5.1, которое также вызывает библиотеку классов в C # и 4.5.1. Это работало годами без проблем. На этой неделе, когда я пытался внести изменения, я столкнулся со странной ошибкой и странной работой вокруг. Я хотел бы знать, что происходит, если бы кто-то мог объяснить это.

Итак, ошибка, которую я получаю, находится в главной форме. Ошибка: «Не удалось найти элемент конечной точки по умолчанию, который ссылается на контракт« ShipService.IShipService »в разделе подтверждения клиента ServiceModel. Это может быть связано с тем, что в вашем приложении не найден файл конфигурации, или из-за того, что элемент конечной точки, соответствующий контракту hihs, не найден в клиентский элемент. "

Я нашел несколько ссылок (см. здесь , здесь и здесь ), которые говорят, чтобы убедиться, что конфигурация в вашей библиотеке классов соответствует тому, что в ваша основная программа. Я попробовал это и все еще получал ошибку. Я не нашел никаких других предложений, кроме как "проверить свою конфигурацию".

Вот где это становится странным. Если я удаляю свою локальную копию и загружаю код из основной ветки, я могу запустить программу без ошибок, если не открываю MainForm.cs. Итак, я отладил его и обнаружил, что ошибка была на уровне бизнес-логики в этом методе:

public void ResetShipService()
{
    shipClient = new ShipServiceClient();
}

Если я закомментирую вышеизложенное и вместо создания ResetShipService создаю новый экземпляр ShipServiceClient, все работает нормально. Программа запускается, и я могу открыть MainForm.cs. Я просто перемещаю это в другое место в том же классе. Я понятия не имею, почему это работает или что здесь происходит. Может кто-нибудь объяснить, что происходит и / или дать мне лучший способ исправить это, чем просто закомментировать код и переместить его в другое место?

Вот схема того, что задействовано:

ShippingService - class library
- Endpoint is net.tcp://localhost:9000/Shipping
- I have no access to change this class library

ShippingApplication - Windows Form Application
- Shipping - Main project
    - MainForm.cs - This is the form that shows the design time error
    - User controls
        - ItemsControl.cs - This is a user control in MainForm.cs that calls the business logic layer
- ShippingBusinessLogicLayer - Business logic layer
    - ShippingBLL.cs - Calls the ShippingService class library

Вот ошибка, которую я получаю: enter image description here

Вот код в BLL, откуда исходит ошибка:

public class ShipmentBLL
{
    private ShipServiceClient shipClient;

    public ShipmentBLL()
    {
        ResetShipService();
    }

    public void ResetShipService()
    {
        shipClient = new ShipServiceClient(); // If I comment out this, the design time error goes away
    }

    private ShipmentDTO processShipment (QuickShipmentDTO QuickShipmentDTO, bool TestShipment = false, bool RelieveInventory = true)
    {
        Ship ship = new Ship();

        if (shipClient.InnerChannel.State == System.ServiceModel.CommunicationState.Faulted)
        {
            ResetShipService(); 
        }

        ship = shipClient.ProcessShipment(ship, TestShipment);
    }
}

Вот код в ItemsControl.cs, который создает экземпляр BLL:

public partial class ItemsToShipControl : UserControl
{
    public ItemsToShipControl()
    {
        InitializeComponent();

        shipmentBLL = new ShipmentBLL();
    }
}

Вот код от дизайнера MainForm.cs, настраивающего пользовательский элемент управления:

this.ItemsToShipPane = new NTSupply.NTShipping.UserControls.ItemsControl();
this.Controls.Add(this.ItemsToShipPane);
private UserControls.ItemsControl ItemsToShipPane;

Вот раздел модели сервиса app.config из службы доставки:

<system.serviceModel>
    <bindings>
        <netTcpBinding>
            <binding name="longTimeoutBinding" receiveTimeout="00:30:00" sendTimeout="00:30:00">
            </binding>
        </netTcpBinding>
    </bindings>
    <services>
       <service behaviorConfiguration="ShippingServiceBehavior" name="NTSupply.Shipping.ShipService">
           <endpoint address="net.tcp://localhost:9000/Shipping" binding="netTcpBinding" bindingConfiguration="longTimeoutBinding"
      contract="NTSupply.Shipping.IShipService" />
           <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange" />
           <host>
               <baseAddresses>
                  <add baseAddress="net.tcp://localhost:9000/Shipping" />
               </baseAddresses>
           </host>
      </service>
    </services>
<behaviors>
  <serviceBehaviors>
    <behavior name="ShippingServiceBehavior">
      <serviceMetadata/>
      <serviceDebug includeExceptionDetailInFaults="True" />
      <dataContractSerializer maxItemsInObjectGraph="65536" />
    </behavior>
  </serviceBehaviors>
    </behaviors>
</system.serviceModel>

Вот файл app.config из проекта «Доставка»:

<system.serviceModel>
    <bindings>
        <netTcpBinding>
            <binding name="NetTcpBinding_IShipService" sendTimeout="00:30:00" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647"/>
         </netTcpBinding>
    </bindings>
    <client>
        <endpoint address="net.tcp://192.168.1.12:9000/Shipping" binding="netTcpBinding" bindingConfiguration="NetTcpBinding_IShipService" contract="ShipService.IShipService" name="NetTcpBinding_IShipService">
        </endpoint>
     </client>
</system.serviceModel>

Вот файл app.config из BLL:

<system.serviceModel>
<bindings>
  <netTcpBinding>
    <binding name="NetTcpBinding_IShipService" />
  </netTcpBinding>
</bindings>
<client>
  <endpoint address="net.tcp://localhost:9000/Shipping" binding="netTcpBinding"
            bindingConfiguration="NetTcpBinding_IShipService" contract="ShipService.IShipService"
            name="NetTcpBinding_IShipService">
    <identity>
      <servicePrincipalName value="host/NTSUPSHIP.anthonymulinaro.local" />
    </identity>
  </endpoint>
</client>
</system.serviceModel> 

1 Ответ

0 голосов
/ 20 июня 2019

По умолчанию, когда мы вызываем сервис, добавляя ссылку на сервис в проект библиотеки классов, во время сотрудничества с основным проектом может быть что-то не так.Прокси-сервер службы использует только основную конфигурацию проекта ( Appconfig ) вместо предыдущей конфигурации, которая автоматически создается в проекте библиотеки классов.Чтобы заставить его работать должным образом, мы должны переместить раздел ServiceModel в проекте библиотеки классов в файл конфигурации, распознаваемый средой размещения, а именно в основной файл конфигурации проекта.
https://docs.microsoft.com/en-us/dotnet/framework/wcf/deploying-a-wcf-library-project
В вашем реальном сценариипроцесс экземпляра клиентского прокси-сервера попытается найти конечную точку клиента, связанное свойство привязки и т. д. Это может привести к проблемам.Мы можем использовать имя конечной точки для экземпляра клиентского прокси при условии, что конфигурация распознается основным проектом.

NetTcpBinding_IShipService

 ServiceReference1.Service1Client client = new  ServiceReference1.Service1Client("NetTcpBinding_IShipService");

Не стесняйтесьдайте мне знать, если есть что-то, с чем я могу помочь.

...