我有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 :(得分: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扩展点进行了广泛的描述。
“如何从IDispatchMessageInspector.AfterReceiveRequest()方法的”System.ServiceModel.Channels.Message“参数中获取实际的请求对象?”
我假设您指的是Web请求。 WebOperationContext.Current但您需要打开ASP.NET兼容模式。