1

我有一个合同如下所示的 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”参数获取实际请求对象?

如果我使用了错误的界面或错误的方法,请纠正我。对此还有其他解决方案吗?

4

1 回答 1

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);
        }
    }
}

您可以将此实现移动到消息检查器或操作调用程序中。Carlos Figueira 对每个 WCF 可扩展点进行了广泛的描述。

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

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

于 2013-06-25T15:32:57.943 回答