在每个实例的 WCF 应用程序中保留一个变量

Posted

技术标签:

【中文标题】在每个实例的 WCF 应用程序中保留一个变量【英文标题】:Persist a variable in WCF application per instance 【发布时间】:2016-08-04 15:48:13 【问题描述】:

我正在创建 WFC Restful 服务,并且需要保留一个变量,该变量将为每个用户保留,有没有一种方法可以实现这一点,而无需将变量传递给我的所有调用?

我正在尝试在整个过程中记录用户的过程、他们的请求失败或成功的天气、IP 地址、他们请求操作的时间、失败时间等。 请注意,我是 WCF 的新手,在此先感谢。

【问题讨论】:

我相信你可以,但你不应该 - 请参阅 If REST applications are supposed to be stateless, how do you manage sessions? 您是在寻找单个请求还是多个相关请求的标识?如果是前者,那么它仍然是“无状态的”——你只是在关联该请求中执行的活动。 我正在寻找一个请求,该调用将带有一个 clientID,我希望在整个调用过程中携带该值,而不必使其成为将要访问的每个方法调用的依赖项。 【参考方案1】:

我最近在做这个(除了它不是 RESTFUL)。您可以通过 HTTP 标头传输信息并在服务端提取该信息。见http://trycatch.me/adding-custom-message-headers-to-a-wcf-service-using-inspectors-behaviors/

【讨论】:

您是否有权访问 OperationContext.Current?【参考方案2】:

对于客户端 ID 本身,我可以建议两个放置位置。一个是OperationContext.Current.IncomingMessageProperties。另一个是CorrelationManager.StartLogicalOperation,它允许您定义一个逻辑操作 - 可以是服务请求,从头到尾 - 或多个操作 - 并为每个操作检索一个唯一 ID。

我倾向于后者,因为它是System.Diagnostics 的一部分,并且可以防止对System.ServiceModel 的依赖。 (CorrelationManager 这个名字甚至描述了你想要做什么。)

无论哪种情况,我都会考虑拦截。这是读取值(无论您将其存储在何处)的理想方式,而无需使用日志记录和客户端 ID 知识来污染各个方法。 (我从您的消息中看到,您正试图避免对客户端 ID 的直接依赖。)

这里有一些关于将 Windsor 添加到 WCF 服务的documentation。 (有时我会在我的博客上添加一些端到端的文档。)然后,当您使用 Windsor 实例化您的服务时,您还可以使用它来实例化依赖项并在它们周围放置 interceptors将在这些依赖项完成工作之前或之后执行您的日志记录。在这些拦截器中,您可以访问或修改该逻辑操作堆栈。

我扔掉几个链接并不是为了温莎正义。我想用一些博客文章来充实它。但我建议调查一下。有很多原因是有益的 - 拦截只是其中之一。它有助于我们组合服务和依赖项的方式。

更新 - 我添加了 blog post - 如何在五分钟内将 Windsor 添加到 WCF 服务。

【讨论】:

我更新了这篇文章以引用我昨晚写的一篇博文,该博文展示了如何快速轻松地将 Windsor 添加到 WCF 服务中。这反过来又为您提供了一些可以使用的拦截工具。以后我会做一些关于拦截器的文档,但是答案中温莎文档的链接会让你开始。

以上是关于在每个实例的 WCF 应用程序中保留一个变量的主要内容,如果未能解决你的问题,请参考以下文章

处理进入故障状态的持久 WCF 客户端

WCF学习——构建一个简单的WCF应用

创建一个简单的WCF程序

如何让我的自托管 WCF 服务不尝试保留 localhost 以外的 url?

重复调用的 WCF 通道生命周期

silverlight 应用程序不能使用 wcf 命名空间