我正在使用wcf 4并尝试在客户端和服务器之间透明地传输上下文信息。
我在看行为并能够传递信息。我的问题是如何将传入头中收到的上下文传递给可能由服务调用的其他服务。
在服务行为中,我拦截消息并读取标题,但不知道将数据放在何处可供当前服务可能进行的下一个服务调用访问。
我正在寻找的是:
public void DoWork()
{
var someId = MyContext.SomeId;
//do something with it here and call another service
using(var proxy = GetProxy<IAnotherService>())
proxy.CallSomeOtherMethodThatShouldGetAccessTo_ MyContextualObject();
}
如果我将标头存储在线程本地存储中,由于线程敏捷性,我可能会遇到问题(不确定这是否发生在ASP.NET之外,即自定义服务主机)。您将如何在上面的代码中实现MyContext
。
我选择MyContext而不是直接访问标题,因为服务调用的发起者可能不是服务,在这种情况下,MyContext由HttpContext支持,例如用于存储。
答案 0 :(得分:0)
在我拦截的服务行为中 消息并阅读标题 但不知道把数据放在哪里 可以访问下一个服务 调用
通常,您之间没有任何状态。每个调用都是完全自治的,每个调用都会从头开始创建一个全新的服务类实例。这是推荐的最佳做法。
如果您需要将该信息(语言,设置等)传递给第二次,第三次,第四次呼叫,请将其传递到标题中。 不开始将状态放入WCF服务器端! WCF服务应该始终是完全自主的,并且不保留任何状态,如果可能的话。
更新:好的,您的评论之后:您可能感兴趣的是WCF 4附带的新RoutingService
基类。它允许您描述的场景 - 从外部获取消息并将其转发到后台某处的其他服务。 Google为“WCF4 RoutingService” - 您应该找到一些文章。我找不到关于标题的具体内容,但我猜这些标题会被透明地传播。
在MSDN杂志中还有一个由两部分组成的文章系列Building a WCF Router Part 1(和part 2 here)在WCF 3.5中大致相同 - 再次,不确定标题,但也许可以给出你有个主意。