У нас есть приложение 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
Вот ошибка, которую я получаю:
Вот код в 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>