如何从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"参数中获取实际请求对象?
如果我使用了错误的接口或错误的方法,请纠正我。对此还有其他解决方案吗?
我假设"[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兼容性模式。