如何创建没有结构的WCF服务(XML请求和响应)

时间:2015-10-15 15:15:31

标签: c# xml web-services wcf soap

在我最近的项目中,我获得了一个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和整合中,所以我们永远不会成为专家,我有一个时间表来满足。任何帮助将不胜感激!!

1 个答案:

答案 0 :(得分:0)

我知道我可以通过实现或覆盖一堆WCF内部接口和类来实现这一点,但我采用了简单的路由并构建了一个自定义的HttpHandler来处理soap调用。它工作得很好(而且速度很快)。唯一有点挑战性的部分是构建WS-Security的东西,但即便如此也不算太糟糕。我很清楚,他们调用的系统只是执行自定义HTTP帖子。不幸的是,微软的工具不支持如此大量的有效Web服务方案。我与一些经验丰富的集成专家进行了交谈,他们在许多合作伙伴集成中放弃了WCF的定制解决方案。如果您控制集成项目的两端,那么很好,请使用WCF。如果您与拥有各种技术的合作伙伴合作,请准备好成为定制WCF或寻找替代解决方案的专家。 如果您遇到同样的问题,请随时给我发消息,我可以与您分享我的代码。这里粘贴太多了。