【问题标题】:WCF client does not include XML declaration in HTTP POST messageWCF 客户端在 HTTP POST 消息中不包含 XML 声明
【发布时间】:2010-09-10 09:00:57
【问题描述】:

这篇文章是关于完成我通过 Web 服务管理代理 (WSMA) 与 Cisco 路由器通信任务的最后一个障碍,如 herehere 所述。不过,您不必阅读这些帖子即可理解我当前的问题。

问题是这样的:我已经构建了服务和消息契约来匹配路由器的 Web 服务,并配置了一个 basicHttpBinding 和一个端点。并且使用通道工厂,我现在几乎(但不完全)与路由器成功通信。

作为回报,我不断收到 SOAP 错误,指出“缺少预期的 XML 标记或序列”。在路由器上使用 WCF 跟踪、提琴手和调试,并通过 HTTP 手动发布消息,我终于弄清楚了发生了什么。

路由器上的 WSMA 代理期望 HTTP 请求中的 SOAP 消息负载包含 XML 声明。而且 WCF 没有发送。 就这么简单。

所以我的问题是:如何使用 basicHttpBinding 使 WCF 在消息中包含 XML 声明?

作为参考,我的绑定配置如下所示:

<basicHttpBinding>
  <binding name="BasicHttpBinding_IWsmaService" messageEncoding="Text" textEncoding="UTF-8" allowCookies="false">
    <security mode="TransportCredentialOnly">
      <transport clientCredentialType="Basic" proxyCredentialType="None" realm="level_15" />
    </security>
  </binding>
</basicHttpBinding>

(如果您想知道 - 是的,我知道我正在通过未加密的传输方式发送明文凭据)

【问题讨论】:

  • 我已关注您关于 Cisco WSMA 和 .NET 的所有主题。你能在某个地方提供一个完整的样本吗?我遇到了同样的问题,并希望将其自动化。

标签: wcf web-services wsma


【解决方案1】:

您必须创建自定义编码器。检查WCF samples。提供的示例显示了如何创建具有现有编码器组合的新编码器。您将使用 TextMessageEncodingBindingElement 创建内部 MessageEncoder。您的 WriteMessage 实现将编写 XML 声明,然后调用内部编码器编写序列化消息。

您还需要将新编码器包装在自定义绑定元素中,并将其与 HttpTransportBindingElement 一起用于自定义绑定。

【讨论】:

  • 是的。比我希望的更多的工作,但这似乎是唯一的方法。而且效果很好。谢谢。
  • @TorHaugen 我知道你很久以前就在 wsma 上完成了这项工作。但现在我正在努力解决它,但它仍然缺乏文档。你能告诉我通知模式是如何工作的吗?一些参考应该很好。
  • @Ladislav Mrnka 我的 WCF 客户端也有同样的问题。您的解决方案似乎有点复杂,我们可以截取消息并添加 xml 声明吗?
猜你喜欢
  • 1970-01-01
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多