我有一个托管在Windows服务中的WCF服务 . 使用此服务的客户端必须在每次调用服务方法时传递标识符(因为该标识符对于被调用方法应该执行的操作非常重要) . 我认为以某种方式将此标识符放入WCF头信息是个好主意 .
如果是个好主意,我该如何自动将标识符添加到 Headers 信息中 . 换句话说,每当用户调用WCF方法时,标识符必须自动添加到标头中 .
UPDATE: 使用WCF服务的客户端是Windows应用程序和Windows Mobile应用程序(使用Compact Framework) .
12 回答
The advantage to this is that it is applied to every call.
创建一个实现IClientMessageInspector的类 . 在BeforeSendRequest方法中,将自定义标头添加到外发邮件中 . 它可能看起来像这样:
然后创建一个 endpoints 行为,将消息检查器应用于客户端运行时 . 您可以通过属性或使用行为扩展元素的配置来应用行为 .
这是一个很好的example如何向所有请求消息添加HTTP用户代理标头 . 我在一些客户中使用它 . 您也可以通过实现IDispatchMessageInspector在服务端执行相同的操作 .
这是你的想法吗?
Update: 我发现了紧凑框架支持的这个list WCF功能 . 我相信消息检查员被归类为'Channel Extensibility',根据这篇文章,紧凑框架支持 are .
您可以使用以下方法将其添加到呼叫
然后,服务器端你使用以下方法获取它:
如果您只想为服务的所有请求添加相同的标头,您可以不使用任何编码!
只需在客户端配置文件的 endpoints 节点下添加头部节点和必需的头
这是另一个有用的解决方案,使用
ChannelFactory
作为代理手动将自定义HTTP标头添加到客户端WCF请求 . 这必须针对每个请求进行,但如果您只是需要对代理进行单元测试以准备非.NET平台,那么就足够了 .这类似于NimsDotNet的答案,但显示了如何以编程方式执行此操作 .
只需将 Headers 添加到绑定即可
您可以在MessageContract中指定自定义标头 .
您还可以使用存储在配置文件中的< endpoint> headers,并将其复制到客户端/服务发送的所有消息的标头中 . 这对于轻松添加一些静态头很有用 .
.NET 3.5中的上下文bindings可能正是您所需要的 . 有三个开箱即用:BasicHttpContextBinding,NetTcpContextBinding和WSHttpContextBinding . 上下文协议基本上传递消息头中的键值对 . 查看MSDN杂志上的Managing State With Durable Services文章 .
如果我理解你的要求,那么简单的答案就是:你做不到 .
这是因为WCF服务的客户端可能由使用您服务的任何第三方生成 .
IF 您可以控制服务的客户端,您可以创建一个基本客户端类,添加所需的头并继承工作类的行为 .
这对我有用,改编自Adding HTTP Headers to WCF Calls
声明这些类后,您可以将新行为添加到WCF客户端,如下所示:
这对我有用
派对有点晚,但Juval Lowy在他的book以及相关的ServiceModelEx库中解决了这个问题 .
基本上,他定义了允许指定类型安全标头值的ClientBase和ChannelFactory特化 . 我建议下载源代码并查看HeaderClientBase和HeaderChannelFactory类 .
约翰