Аутентификация WCF и исключение прерванного сокета - PullRequest
0 голосов
/ 29 июля 2010

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

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

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

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

Проблема:

Я получаю исключение Socket Aborted при попытке использовать метод из службы. Вот код, который я использую, чтобы открыть соединение с сервисом. 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.Opened, вызывается пользовательский валидатор и возвращается без исключения.

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

InnerException отсутствует.

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

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

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

1 Ответ

0 голосов
/ 29 июля 2010

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

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

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