2013-02-27 4 views
0

Я использую WCF custom Validator с HTTPS (.NET 4.5). Validate on success возвращает объект Customer, который я хотел бы использовать позже. В настоящее время я могу сделать это со статическими переменными, которые мне нравится избегать, если это возможно. Я попытался использовать HttpContext, который становится нулевым в основном потоке. Я понимаю Подтвердить Оценка: бежит под другой нитью. Есть ли способ поделиться информацией о сеансе без участия совместного использования базы данных или файла. См. Связанные темы here и here.UserNamePasswordValidator и управление сеансом

В Authentication.cs

public class CustomValidator : UserNamePasswordValidator 
{ 
     public override void Validate(string userName, string password) 
     { 
     //If User Valid then set Customer object 
     } 
} 

В Service.cs

public class Service 
    { 
     public string SaveData(string XML) 
     { 
     //Need Customer object here. Without it cannot save XML. 
     //HttpContext null here. 
     } 
    } 

ответ

0

Хорошо, это должно было быть проще. Поскольку работает UserNamePasswordValidator, мне нужно было использовать пользовательскую авторизацию для передачи UserName/Password в основной поток и снова получать информацию о клиенте из базы данных. Это дополнительный вызов БД, но приемлемый обходной путь на данный момент. Пожалуйста, загрузите код с Rory Primrose's genius blog entry.

1

Я могу предложить вам альтернативный подход. Предполагая, что служба WCF запущена в режиме совместимости с ASP.Net, и вы сохраняете объект клиента в хранилище сеансов. Создание класса, таких как AppContext

Код будет выглядеть примерно так

public class AppContext { 
public Customer CurrentCustomer { 
    get { 
    Customer cachedCustomerDetails = HttpContext.Current.Session[CUSTOMERSESSIONKEY] as Customer; 
     if (cachedCustomerDetails != null) 
     { 
      return cachedCustomerDetails; 
     } 
     else 
     { 
      lock (lockObject) 
      { 
       if (HttpContext.Current.Session[CUSTOMERSESSIONKEY] != null)  //Thread double entry safeguard 
       { 
        return HttpContext.Current.Session[CUSTOMERSESSIONKEY] as Customer; 
       } 

       Customer CustomerDetails = ;//Load customer details based on Logged in user using HttpContext.Current.User.Identity.Name 
       if (CustomerDetails != null) 
       { 
        HttpContext.Current.Session[CUSTOMERSESSIONKEY] = CustomerDetails; 
       } 

       return CustomerDetails; 
      } 
     } 
    } 
} 

Основная идея здесь является сделать отложенную загрузку данных, когда оба WCF и ASP.Net трубопроводы выполнены и HttpContext доступен ,

Надеюсь, это поможет.

+0

Благодарим за ответ. Я уже пробовал это решение. HttpContext выходит из области действия, когда вы переходите от метода Validate to SaveData. FYI, также OperationContext null в Validate. –

+0

Итак, вместо HttpContext используйте OperationContext. Вы можете получить имя пользователя из OperationContext.Current.ServiceSecurityContext.PrimaryIdentity.Name. Вы не добавляете клиента в сеанс во время Authenitcate. Вы добавляете его в сеанс, когда запрашиваются данные о клиенте. К этому времени пользователь аутентифицируется, а сеанс доступен для вашей службы. – Chandermani

+1

OperationContext имеет значение null в Validate. UserNamePasswordValidator работает в другом контексте/потоке. –

Смежные вопросы