每次调用都将数据传递给 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的主要内容,如果未能解决你的问题,请参考以下文章

Qt C++ - 如何成功地将数据传递给子进程?

在函数内将数据传递给 segue.destination 的问题

通过 Redirect 将数据传递给组件

如何从调用方法didSelectRowAtIndexPath将数据传递给ios应用程序中的子视图控制器

如何通过数组将数据传递给表格视图?

通过 Segue 将数据传递给新的 ViewController