如何从wcf消息中获取请求对象

本文关键字:获取 请求 对象 消息 wcf | 更新日期: 2023-09-27 18:19:46

我有一个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"来实现"IDispatchMessageInspecter"。

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

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

如何从wcf消息中获取请求对象

我假设"[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兼容性模式。