我必须使用C#程序调用Web服务。 Web服务很可能不是标准格式。接口描述(wsdl和xsd)非常复杂,使用代理生成机制导致数百个类。生成的类很少有帮助,因为它们非常通用,大多数都是简单的Object类型作为成员。最好的选择是手动构建SOAP消息。这也是Web服务提供商建议选择的方式:获取必须发送的soap / xml消息并根据模板构建消息。现在的问题是如何最有效地构建消息。当然硬编码消息字符串是一个选项,但我想知道是否存在更好的选项。如果我在字符串中有完整的消息,我该如何最好地发送消息。我应该使用简单的HttpRequest还是可以使用wcf堆栈的机制? 我目前构建消息的方法如下:
string msg = envelopeBegin;
RouteType rootType = new RouteType();
XmlSerializer serializer = new XmlSerializer(typeof(RouteType));
StringWriter stringWriter = new StringWriter();
serializer.Serialize(stringWriter, rootType , customNamespace);
msg += stringWriter.ToString();
msg += envelopeEnd;
//通过网络发送消息
我必须生成的Soap / xml消息如下所示
<env:Envelope>xmlns:env=http://schemas.xmlsoap.org/soap/envelope/ xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns0="http://www.skanska.se/oagis/9/ws/faults">
<env:Body>
<ska:ShowSalesOrder xmlns:ska="http://www.skanska.se/oagis/9" systemEnvironmentCode="UTV" versionID="1.0" releaseID="9.0">
<!--plsql=.74s-->
<ApplicationArea xmlns="http://www.openapplications.org/oagis/9">
<!--user_name=SEBA_RAPPE-->
<ska:Sender>
<LogicalID>OEBS_SE</LogicalID>
<ComponentID>SKAIS017I</ComponentID>
<AuthorizationID>SEBA_RAPPE</AuthorizationID>
<ska:ResponsibilityID>XXOM_INTEGRATION_SVT</ska:ResponsibilityID>
</ska:Sender>
<CreationDateTime>2010-02-26T15:03:27+01:00</CreationDateTime>
<BODID>xxxxxxxxxxxxxxxxx</BODID>
</ApplicationArea>
<ska:DataArea>
<Show xmlns="http://www.openapplications.org/oagis/9">
<ResponseCriteria>
<ResponseExpression actionCode="Never" expressionLanguage="xPath">*</ResponseExpression>
</ResponseCriteria>
</Show>
<ska:SalesOrder>
<SalesOrderHeader xmlns="http://www.openapplications.org/oagis/9">
<DocumentID>
<ID>141779</ID>
</DocumentID>
<RequestedShipDateTime>2009-11-04T07:00:54+01:00</RequestedShipDateTime>
</SalesOrderHeader>
</ska:SalesOrder>
</ska:DataArea>
</ska:ShowSalesOrder>
</env:Body>
</env:Envelope>
答案 0 :(得分:2)
您绝对可以使用WCF基础结构,而无需为所有各种消息定义类型。 WCF通过Message类专门支持此功能。使用它并不是那么困难。这里有一些关于它们的更多信息,但基本上你会使用XML读者和编写器来读取和写入消息。
答案 1 :(得分:0)
一种方法是创建一个包含值的占位符的XML骨架模板。读取XML并将值替换为对象中的值。使用HttpWebRequest将生成的XML发布到Web服务。
即使这种方法可行,我强烈建议您创建一个WCF代理类并使用它,即使Web服务包含数百个未使用的方法和对象。只要它是有效的WSDL,WCF就会处理它。此外,如果Web服务有任何更改,您只需重新生成代理。为了避免此Web服务的丑陋,请创建自己的基础结构,仅公开有用的方法和类,并隐藏真实的调用。