Проверка подлинности WCF и исключение с прерыванием сокета

#wcf #certificate #net.tcp

#wcf #сертификат #net.tcp

Вопрос:

вот настройки для проекта.

У меня есть служба WCF, которая размещена в привязке net.tcp в буферизованном режиме и включена ReliableSession.

Привязка настроена на использование TransportWithMessageCredential security. Сертификат является самозаверяющим сертификатом, который я идентифицирую с помощью отпечатка большого пальца. UserNameValidator — это пользовательский валидатор, который при тестировании никогда не дает сбоев (раньше он не давал сбоев, но я устранил неопределенность)

Служба и клиент находятся на одном компьютере, и у них обоих есть доступ к сертификату.

Проблема:

Я получаю исключение с прерыванием сокета при попытке использовать метод из службы. Вот код, который я использую для открытия соединения со службой. MonitorServiceCallbacks содержит только пустые методы для выполнения требований интерфейса.

  _instanceContext = new InstanceContext(new MonitorServiceCallbacks());
 _serviceInterface = new MonitorCallbackServiceClient(_instanceContext);

 _serviceInterface.ClientCredentials.UserName.UserName = Environment.MachineName;
 _serviceInterface.ClientCredentials.UserName.Password = "myPassword";
 _serviceInterface.Open();
  

Похоже, что это нормально работает как _serviceInterface.Переменной State присваивается значение State.Открыт, вызывается пользовательский валидатор, который возвращает данные без исключений.

Однако, если я попытаюсь вызвать метод с использованием прокси _serviceInterface, в службе не будет запущен код, который я могу взломать, и журнал трассировки не выявит ошибок, кроме исключения с прерыванием сокета, которое возникает через 1 минуту после получения того, что кажется сообщением для метода.

Нет исключения InnerException.

Я попытался найти проблему в Google, но результаты, как правило, говорят «просто отключите безопасность, и все будет работать нормально». К сожалению, это невозможно сделать.

Я крайне смущен этой проблемой, и буду признателен за любую помощь.

Большое спасибо,
Ehrys

Комментарии:

1. Привет, трассировка WCF включена, но, как я уже указывал, она не дает мне никакой полезной информации. Первое исключение, которое он получает, — это исключение с прерыванием сокета. Уровень трассировки установлен на подробный, отслеживание активности, распространение активности

Ответ №1:

На самом деле это была ошибка сериализации.

Объект, который я пытался отправить в службу, унаследован из контракта данных. Итак, я пытался отправить службе приведение к контракту данных.

Похоже, что WCF этого не разрешает.

Я хотел бы поблагодарить Джона Сондерса за напоминание мне, что трассировка может быть включена не только для службы. Включение трассировки на стороне клиента сэкономило бы мне много времени.

Я пытался выполнить следующее:

 _serviceInterface.Register((MyDataContract)MyParentObject, aVariable, anotherOne);
  

Что мне нужно было сделать:

 MyDataContract tempContract = MyParentObject.CreateMyDataContract();
_serviceInterface.Register(tempContract, aVariable, anotherOne);
/* Note: MyParentObject.CreateMyDataContract() is my own method which creates an instance
of the MyDataContract and copies the relevant information to it */