#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 */