我需要从我的 .NET 应用程序配置和查询 Cisco 路由器,我需要通过 Cisco WSMA 来完成网络服务接口(interface)。
这些服务通过 HTTP(在我的例子中)公开,并使用 SOAP 1.2 来封装请求和响应(架构 here)。因此调用可能如下所示(来自 Wikipedia article 的示例):
<SOAP:Envelope xmlns:SOAP="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP:Body>
<request correlator="4.7" xmlns="urn:cisco:wsma-config" >
<configApply details="all">
<config-data>
<cli-config-data>
<cmd>access-list 1 permit any</cmd>
<cmd>ip hst foo 1.1.1.1</cmd>
<cmd>no cns exec 80 </cmd>
</cli-config-data>
</config-data>
</configApply>
</request>
</SOAP:Body>
</SOAP:Envelope>]]>]]>
当然,这一切都非常酷(当然比使用 telnet 好 - 它支持原子事务 - 全部成功或全部失败 - 而 CLI 不支持)。
但直到现在,我一直生活在一个舒适的 .NET 泡沫中,其中 Web 服务发出 WSDL,我可以在客户端中构建代理,一切正常(或不正常 ;-)。据我所知,没有可用的 WSDL,而且我不太明白如何解决这个问题。
- 我如何为这样的事情配置 WCF(设置 basicHttpBinding 和客户端端点)?
- 如何将这些模式转化为契约?手工?
- SvcUtil 可以对这些模式做任何有用的事情吗?
- 如果我能以某种方式创建契约(Contract),这是否意味着我可以生成代理来工作,还是我必须在较低级别工作?
我知道一旦我有了动力,我就会过得很好。有类似经历的人可以成为明星并给我一些关于如何去做的要点吗?也许给我指点一些相关的博客文章?
最佳答案
使用 XSD.exe 从提供的 XSD 生成类。它接缝每个文件都包含请求、响应和错误的 XSD,因此每个文件代表单个操作。像这样创建服务契约(Contract)
// ConfigXSDError, ConfigXSDRequests and ConfigXSDResponse are types generated by XSD
// Message contracts are needed to avoid wrapping
[MessageContract(IsWrapped = false)]
public class ConfigResponse
{
[MessageBodyMember]
[XmlElement("response")]
public ConfigXSDResponse Response { get; set; }
}
[MessageContract(IsWrapped = false)]
public class ConfigRequest
{
[MessageBodyMember]
[XmlElement("request")]
public ConfigXSDRequest Request { get; set; }
}
// Other message contracts
// Service contract uses XmlSerializer instead of DataContractSerializer
[ServiceContract]
[XmlSerializerFormat(SupportFaults = true)]
public interface ICiscoRouter
{
[OperationContract]
[FaultContract(typeof(ConfigXSDError))]
ConfigResponse Config(ConfigRequest request);
// Other methods
}
使用ChannelFactory为服务创建代理。
关于.net - 从 .NET 使用 Cisco WSMA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3658385/