这篇文章讲述了完成我通过Web服务管理代理(WSMA)与思科路由器通信的最后一个障碍,如here和here所述。但是,您不必阅读这些帖子来了解我当前的问题。
问题是:我已经构建了服务和消息合同以匹配路由器的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>
(如果你想知道 - 是的,我知道我正在通过未加密的传输发送明文凭据)
答案 0 :(得分:1)
您必须创建自定义编码器。检查WCF samples。提供的示例显示了如何创建具有现有编码器的新编码器。您将使用TextMessageEncodingBindingElement来创建内部MessageEncoder。您的WriteMessage implementatoin将编写XML声明,而不是调用内部编码器来编写序列化消息。
您还需要将新编码器包装在自定义绑定元素中,并将其与HttpTransportBindingElement一起用于自定义绑定。