每次调用都将数据传递给 WCF
Posted
技术标签:
【中文标题】每次调用都将数据传递给 WCF【英文标题】:Passing data to WCF with every call 【发布时间】:2013-12-18 13:54:05 【问题描述】:如何在每次调用 WCF 服务时传递一个字符串(没有单例)。例如,我需要在每次调用时传递 CultureInfo 字符串。 在 Remoting 的早期,我曾经从客户端传递数据,例如
CallContext.LogicalSetData("CultureInfo", "en-Us")
并在服务器中检索(在不同的应用程序域中运行),如
CallContext.LogicalGetData("CultureInfo").
这在 WCF 中不起作用。 CallContext.LogicalGetData 始终为空。
【问题讨论】:
【参考方案1】:不幸的是,在 WCF 中,它并不那么容易。但是,您可以为所有操作执行一次。您可以实现IClientMessageInspector,它允许您在发送之前修改每个请求。然后添加您的自定义邮件标题。请注意,这是一个 Soap 消息标头而不是 HTTP 标头。
public object BeforeSendRequest(ref System.ServiceModel.Channels.Message request,
System.ServiceModel.IClientChannel channel)
request.Headers.Add(MessageHeader.CreateHeader("CultureInfo",
"http://mynamespace", Thread.CurrentThread.CurrentUICulture.Name));
return null;
在服务器端,实现IDispatchMessageInspector
public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request,
IClientChannel channel, InstanceContext instanceContext)
string culture = request.Headers.GetHeader<string>("CultureInfo",
"http://mynamespace");
Thread.CurrentThread.CurrentCulture
= CultureInfo.CreateSpecificCulture(culture);
return null;
您还需要实现一些自定义行为来应用消息检查器。要实现这些行为,请参阅 MSDN 页面:
http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iclientmessageinspector.aspx http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.idispatchmessageinspector%28v=vs.110%29.aspx
【讨论】:
感谢罗伯特。我使用上面的示例实现了它,既作为 endpointbehvior (添加到服务端点)也作为 customattribute (使用 customattribute 装饰接口合同)。两者都可以独立工作。使用其中一个有什么优势吗? 很高兴它成功了。我认为端点行为的优点是可以通过配置添加。属性实现需要重新编译。如果您遇到需要在部署后将行为添加到客户端的情况,则该行为可能更可取。另一方面,对于稍后阅读代码的其他人来说,该属性更清楚。以上是关于每次调用都将数据传递给 WCF的主要内容,如果未能解决你的问题,请参考以下文章
在函数内将数据传递给 segue.destination 的问题