【问题标题】:several services with one session一个会话的多个服务
【发布时间】:2012-12-09 17:04:42
【问题描述】:

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

1) 我想创建一个大的 WCF 服务,而不是几个小的 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)、(2) 和 (3) 中指定您的问题...另外,您如何使用 accessToken 等以及它们在哪里填充,请明确说明?跨度>
  • @AdilMughal:accessToken 客户端通过调用 GetToken 方法获取。此方法将令牌返回给客户端并保存在服务的私有字段中。然后,当客户端发出请求时,它会将此访问令牌用于请求。在 validate 方法中,服务中保存的 accessToken 与请求对象中保存的令牌进行比较。

标签: c# wcf soa


【解决方案1】:

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

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

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

对于 3: 当您验证客户端参数时,最好抛出 FaultException,因为它会在后台生成 SOAPFault

【讨论】:

  • 如果没有.NET 客户端:ipad、android 设备、3-rd 方网站?
  • @user1260827:那么您仍然可以在标头中传递值...但是对于移动设备,我们通常会创建一个 RESTful HTTP Web API(有时是 SOAP 服务的包装器)传递 JSON 以获取数据和利用 Http Headers 进行客户端身份验证或授权字段
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 2019-08-02
  • 1970-01-01
相关资源
最近更新 更多