WCF中的自定义标头

时间:2009-08-07 18:57:15

标签: soap wcf wcf-binding

我想在我的wsdl上添加特定的自定义标头以获取传入的soap消息,因此我已将所需的标签添加到web.config的标头节点中,如下所示:

 <headers>
   <Tag>Value</Tag>
 </headers>

但是,如果自定义标记中的“值”设置为“值”,当我更改此值时,服务会将其解除,从而产生以下错误;

'DestinationUnreachable - 由于EndpointDispatcher上的AddressFilter不匹配,无法在接收方处理带有To'http://localhost:3537/Service1.svc'的消息。检查发送方和接收方的EndpointAddresses是否一致。'

那么如何为标签之间的实际值指定变量值?比如在url模板中,即

 <headers>
   <Tag>{variable value here}</Tag>
 </headers>

任何想法,或者我是否以错误的方式处理自定义标头?我不想使用messageContract,因为我们在文档样式上使用RPC样式soap。

另一个奇怪的事情是,为了使消息有效,header元素中定义的自定义必须使用ws-addressing命名空间指定'IsReferenceParameter =“true”'属性,否则会引发上述错误?

 <Tag a:IsReferenceParameter="true">Value</Tag>

任何人都可以向我解释这个吗?

提前致谢

乔恩

1 个答案:

答案 0 :(得分:2)

我无法真正解释您的具体问题 - 但通常情况下,您会在代码中向WCF调用添加自定义标头,通常使用行为而不是web.config。不确定这是否真的有效。

您的自定义标头行为当然可以读取它将从配置文件或数据库表或其他内容发送的值。

但如果您真的想在邮件中强制执行SOAP标头,我认为您最好的选择就是使用邮件合同。为什么你不能或不想使用消息合同?这实际上是消息合同的唯一目的:定义显式SOAP消息布局,包括自定义标头。

查看有关该主题的一些文章和博客文章:

这个blog post here展示了如何通过实现自定义的“WsdlExporter”类将自定义SOAP标头注入到生成的WSDL中 - 也许这就是你的选择?

如果你只是谷歌的话可以获得更多的资源 - 这是一种非常常见的情况,许多人已经通过多种方式实现了它,有一些巧妙的解决方案,并在博客上写了 - 你应该没有找不到所有答案的麻烦!

马克