0

我正在使用带有 HTTPS (.NET 4.5) 的 WCF 自定义验证器。验证成功返回我想稍后使用的客户对象。目前,我可以使用我希望尽可能避免的静态变量来做到这一点。我尝试使用在主线程中变为 null 的 HttpContext 。我的理解Validate在不同的线程下运行。有什么方法可以在不涉及数据库或文件共享的情况下共享会话信息。在此处此处查看相关主题。

在 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.
      }
  }  
4

2 回答 2

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 可用时进行数据的延迟加载。

希望能帮助到你。

于 2013-02-27T08:43:45.177 回答
0

好吧,这应该更容易。由于 UserNamePasswordValidator 的工作方式,我需要使用自定义授权将 UserName/Password 传递给主线程并再次从数据库中获取客户信息。这是一个额外的数据库调用,但目前可以接受的解决方法。请从Rory Primrose 的天才博客条目下载代码。

于 2013-03-06T00:02:18.210 回答