【发布时间】:2015-10-15 15:15:31
【问题描述】:
在我最近的项目中,我收到了一个 WSDL 和一个示例请求,用于构建 Web 服务。 WCF 的契约优先能力较弱,但我确实提出了一些可能有效的复杂工具(我尝试了许多工具,最好的是 WSCF.Blue)。 SOAP 请求标头、展开的正文和 XSD 都是非正统的,我担心这个集成伙伴会遇到很多奇怪的 XML 问题,所以如果可能的话,我宁愿提供一个看起来像这样的服务:
[ServiceContract]
public interface IMyService
{
[OperationContract]
XmlElement DoStuff(XmlElement request);
}
而不是...
[ServiceContract]
public interface IMyService
{
[OperationContract]
[XmlSerializerFormat(SupportFaults = true, Style = OperationFormatStyle.Document, Use = OperationFormatUse.Literal)]
ResponseType DoStuff(RequestType request);
}
这个 SOAP 请求的超级简化版本如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<SOAP-ENV:Header>
<ns1:CustomHeader priority="1" txId="1" xmlns:ns1="http://namespace"/>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<UnwrappedRequest creationDateTime="2014-04-21T16:15:37Z" xmlns="http://anothernamespace.com">
<ns1:SomeDataNode xmlns:ns1="http://namespace">
<ns1:MoreData AFlag="false" Thingy="Dude">
</ns1:MoreData>
</ns1:SomeDataNode>
</UnwrappedRequest>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
我想坚持使用 WCF 而不仅仅是创建 HTTP 处理程序或其他东西的主要原因是因为我们还必须使用 WS-Security,其中包括一堆其他标头和在实际 API 调用之前建立会话的请求。我尝试了几件几乎可以工作的事情,但它们排除了请求的顶部节点及其所有属性(上面示例中的节点)。我还需要自定义标头 XML。我知道你可以将它绑定到请求对象的属性中,但我希望请求只是一个 XML 字符串。
您会认为那里的每个框架都应该能够轻松地做到这一点,我知道 WCF 也不例外。我们都喜欢 WCF 的一点是它的灵活和强大。问题是我们大多数人并不生活在 WCF 和集成中,所以我们永远不会成为专家,我有一个时间表来满足。任何帮助将不胜感激!
【问题讨论】:
-
自从我使用 WCF 已经有一段时间了,但最后我记得它需要一个配置文件。您可以尝试另一种解决方案,例如 ServiceStack。他们有一个较旧的开源版本,去下载并滚动到底部,我觉得它很容易使用而且是免费的。
-
XML 可以放入 HTML 中的 CData 标记中。
标签: c# xml web-services wcf soap