【发布时间】: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 与请求对象中保存的令牌进行比较。