2012-04-16 2 views
0

Мне нужна служба двусторонней печати, и я хочу знать, правильно ли клиент ввел ее имя пользователя и пароль, потому что я только хочу позволить использовать методы этой услуги, если пользователь ранее отправил свое имя пользователя и пароль правильно ,WCF: лучше за звонок за сеанс в этом сценарии?

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

Я имею в виду, в этом случае:

1.- A пользовательский метод вызова входа() и отправить имя пользователя и пароль. В этом случае это правильно.

2.- Пользователь теперь может вызывать остальные методы службы. Например, метод1(). У меня есть вопрос. Как это за вызов, в каждом вызове метода создается новый экземпляр, но от одного и того же клиента каждый обратный вызов имеет другой код или тот же самый? Если одно и то же, когда клиент имеет другой обратный вызов, когда он перезапускает приложение?

Если обратный вызов отличается при каждом вызове, как я могу узнать, отправил ли клиент ранее свое имя пользователя и пароль? Мне нужно отправить журнал и пароль в качестве параметра метода?

Если обратный вызов тот же, можно ли узнать, когда клиент закроет соединение, чтобы удалить обратный вызов из моего статического списка? Возможно, это будет контроль соединения?

Спасибо.

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

ответ

0

Если вы используете PerCall, у вас все еще может быть SessionMode = SessionMode.Required. Затем вы можете просто украсить свой атрибут контракта операции входа в систему с помощью IsInitiating = true, который сообщает wcf, что операция запускает сеанс. Все остальные операции должны быть установлены на IsInitiating = false. Если клиент вызывает метод, который не запускает сеанс перед вызовом логина, будет выбрано исключение.

т.е.

[ServiceContract(Namespace = "Services", SessionMode = SessionMode.Required, CallbackContract =   typeof(SVIMyCallback))] 

[OperationContract(Name = "login", IsInitiating = true)] 
[OperationContract(Name = "doSomething", IsInitiating = false)] 
Смежные вопросы