一个会话的几个服务

时间:2012-12-09 05:21:29

标签: c# wcf soa

我是WCF的新手,我有以下问题:

1)我想创建一个大型WCF服务,而不是几个小型服务。这就像是幕墙设计模式的实现。

为什么呢?我需要为客户端进行会话,我需要存储有关客户端的敏感信息(访问令牌,用户名,API密钥)并对其进行验证。通过这种方式,我只创建私有字段:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class ApplicationService : IApplicationService
{
     private string _accessToken;
     private string _userName;

     public OrderResponse GetOrder(OrderRequest request)
     {
          var response = new OrderResponse();
          var result = Validate(request, response);
          ... other code
     }

     public CustomerResponse GetCustomer(CustomerRequest request)
     {
          var response = new CustomerResponse();
          var result = Validate(request, response);
          ... other code
     }

     public LoginResponse Login(LoginRequest request)
    {
          var response = new LoginResponse();
          var result = Validate(request, response);
          ... other code
     }

     public LogoutResponse Logout(LogoutRequest request)
     {
          var response = new LogoutResponse();
          var result = Validate(request, response);
          ... other code
     }

     public bool Validate(BaseRequest request, BaseResponse response)
     {
          if(request.Token != _accessToken)
               return false;

          ... validate other fields

          return true   
     }

     // many other methods

}

2)如果我创建一个包含所有其他WCF服务的大型服务。此外,它就像是外观设计模式的实现。:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class ApplicationService : IApplicationService
    {
         private string _accessToken;
         private string _userName;
         private LoginService _loginService;
         private CustomerService _customerService;
         private OrderService _orderService;

         public ApplicationService()
         {
              _loginService = new LoginService();
              _orderService = new OrderService();
              _customerService = new CustomerService();
         }

         public OrderResponse GetOrder(OrderRequest request)
         {
              var response = new OrderResponse();
              var result = Validate(request, response);
              if(!result) return Something;
              return _orderService.GetOrder(request);
         }

         public CustomerResponse GetCustomer(CustomerRequest request)
         {
              var response = new CustomerResponse();
              var result = Validate(request, response);
              if(!result) return Something;
              return _customerService.GetCustomer(request);
         }

         public LoginResponse Login(LoginRequest request)
         {
              var response = new LoginResponse();
              var result = Validate(request, response);
              if(!result) return Something;
              return _loginService.Login(request);
         }

         public LogoutResponse Logout(LogoutRequest request)
         {
              var response = new LogoutResponse();
              var result = Validate(request, response);
              if(!result) return Something;
              return _LoginService.Logout(request);
         }

         // many other methods
    }

您对此有何看法?

3)还有一个问题:当验证失败时,我必须返回什么?抛出FaultException或者我可以在响应对象中返回错误消息吗?什么是好的做法?

感谢。

1 个答案:

答案 0 :(得分:0)

对于1和2: 创建Facade并不是一件坏事,但创建外观的目标很重要。 如果你想要实现的只是在每个请求中传递accessToken等,那么也许你可以在SOAP头中传递它们。如果您有.net客户端,则使用行为扩展在每个WCF服务请求中传递我们的自定义参数。见blog post

此外,一旦客户端从GetToken获得accessToken,然后让客户端存储它并在每次服务调用时传递它,而不是在客户端的服务器上创建会话。这也有助于您扩展服务,并在会话丢失的情况下使服务可行。

通过这种方式,您可以验证客户端accessToken,还可以从业务逻辑中抽象出客户端验证逻辑。

3: 验证客户端参数时,最好抛出FaultException,因为它会在引擎盖下生成SOAPFault