2010-08-30 254 views
1

我applciation的工作原理如下全局变量

[user]----username/password/domain----->[WCF service] 

然后我访问域名服务器,看看有实际DB用户与之相关联, 得到那个后,我验证用户在他的实际DB(数据库是每个域)

问题是,我需要一个地方来存储下面的请求对数据库的域名。

例如,如果用户调用一个WCF服务操作:

Test() 

第一验证过程被调用时,(WCF UserNamePasswordValidator),其验证用户密码(这被发送作为用于REST的报头的一部分或作为SOAP的一部分),并且下一个要调用的函数是Test,但是到那时我不能告诉用户的域名(实际上再次请求该域名..)

我不想将每个域的签名更改为

Test(string domain) 

我不能简单地访问头文件,因为我公开了REST和SOAP相同的方法,并且每个头文件的身份验证都不相同。(其中一个头文件与Amazon S3相同,后者使用SOAP标准)

所以基本上我正在寻找一个全球性的,每个呼叫存储。(我想避免每次通话开始方法)

感谢。编辑: 也许我应该使用ThreadStaticAttribute?那会工作吗?

回答

1

WCF知道当前OperationContext。你可以为它编写自己的扩展。与这个问题无关,我在这个NHibernate会话管理here中使用了相同的机制,它也可能适用于它的概念。它访问InstanceContext,但概念是相似的。

+0

看起来不错,会试试:) – MindFold 2010-08-30 16:12:51

2

这不起作用。您不能在UserNamePasswordValidator中存储任何内容。它甚至无法访问OperationContext,因为它运行在不同的线程上。

这样做的方法是创建自定义消息检查器,并将自定义消息头中的信息提取到自定义操作上下文扩展中,如Frank所述。

+0

哇!这是一个巨大的过度杀死这样一个简单的操作... 必须有一个更优雅的方式.. – MindFold 2010-08-30 18:39:29

+0

矫枉过正?不,这是如何以集中方式处理自定义标题的标准方式。 – 2010-08-30 19:01:57