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

时间:2016-04-13 13:40:20

标签: c# wcf wcf-rest

我正在创建一个WFC Restful服务,需要保留一个每个用户都会保留的变量,有没有办法实现这一点而不必将变量传递给我的所有调用?

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

我倾向于后者,因为它是System.Diagnostics的一部分,可以防止对System.ServiceModel的依赖。 (名称CorrelationManager甚至描述了您尝试做的事情。)

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

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

我没有通过抛出一些链接来做温莎的正义。我想通过一些博客文章来充实它。但我建议调查一下。这有很多原因 - 拦截只有一个。它有助于我们构建服务和依赖关系的方式。

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