2013-06-25 54 views
1

我有WCf服务与合同如下所示。如何从wcf消息中获取请求对象?

[MessageContract] 
public class ServiceRequest 
{ 
    [MessageBodyMember] 
    public int RequestId { get; set; } 

    [MessageBodyMember] 
    public OrderDetails OrderDetails { get; set; } 

} 

[DataContract] 
public class OrderDetails 
{ 
    [IsLogRequired] 
    public int OrderId { get; set; } 
    [IsLogRequired] 
    public int Quantity { get; set; } 
    public string CustomerName { get; set; } 
} 

[IsLogRequired]是自定义属性。

当收到请求时,我们需要获取请求中具有“[IsLogRequired]”属性的所有属性。我们希望将其作为通用解决方案,以便它可以插入到所有服务中。

我们认为使用“MessageInspector”来执行“IDispatchMessageInspector”。

如何从IDispatchMessageInspector.AfterReceiveRequest()方法的“System.ServiceModel.Channels.Message”参数中获取实际的请求对象?

如果我使用错误的界面或错误的方法,请纠正我。任何其他解决方案?

回答

0

我假设“[IsLogRequired]是自定义属性”。意味着一个自定义属性...

简单的答案是,没有解决方案来传输装饰数据合同的自定义属性,如您所描述的那样。

数据契约应该是纯粹的,而不是被业务逻辑所阻碍。了解如何应对各个领域的工作属于服务实施。

可能的办法是这样的:

public class OrderService : IOrderService 
{ 
    private void ProcessOrder(Order order) 
    { 
     var ra = new AuditMetadataResourceAccess(); 
     MethodInfo[] fieldsToLog = ra.GetLoggingFields(typeof(OrderDetal)); 

     if (fieldsToLog.Any()) 
     { 
      var logger = new LogingEngine(); 
      logger.Log(fieldsToLog, order.OrderDetails); 
     } 
    } 
} 

你可以移动邮件检查或operation invoker这里面实现。 Carlos Figueira对每个WCF可扩展性点都有广泛的描述。

我要如何从实际的请求对象‘System.ServiceModel.Channels.Message’IDispatchMessageInspector.AfterReceiveRequest的参数()方法?

我假设你指的是Web请求。 WebOperationContext.Current但您需要打开ASP.NET兼容模式。

相关问题