我正在使用我们的票务系统OTRS中的SOAP Web服务。所以Web服务并不是我真正掌控的。
请求工作得很好,但我从来没有在我的代码中得到答案。答案总是空的。 (var response = client.SessionCreate(session);
)
奇怪的是,该售票系统的wireshark和webservice控制台都说我应该收到一个有效的答案。
由于我对这个webservice的东西很新,所以我完全不知道在这种情况下从哪里开始。所以这是对我的描述。任何建议都非常感谢。
首先,我创建了一个普通的C#项目并添加了WSDL文件,该文件只能在OTRS项目的GitHub站点网站上找到。我将它添加为服务引用,然后添加了我的C#代码,看起来像这样。
//对于Debug System.Net.ServicePointManager.Expect100Continue = false; Thread.CurrentThread.CurrentUICulture = new CultureInfo(" en-us");
try
{
OTRS.OTRS_Error err = new OTRS.OTRS_Error();
OTRS.GenericTicketConnector_PortTypeClient client = new OTRS.GenericTicketConnector_PortTypeClient("GenericTicketConnector_Port");
OTRS.SessionCreate session = new OTRS.SessionCreate();
session.Item = "someUserNameGoesHere";
session.ItemElementName = OTRS.ItemChoiceType8.UserLogin;
session.Password = "SomePasswordGoesHere";
var response = client.SessionCreate(session);
Console.WriteLine(response.SessionID);
Console.WriteLine(response.Error);
}
catch (Exception exep)
{
Console.WriteLine(exep.Message);
Console.WriteLine(exep.InnerException);
}
finally
{
Console.ReadLine();
}
服务器端的传入消息
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://www.otrs.org/TicketConnector/SessionCreate</a:Action>
<a:MessageID>urn:uuid:14750529-3de2-4618-8db4-8ac18b681c18</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand="1">http://SomeServer/otrs/nph-genericinterface.pl/Webservice/GenericTicketConnector</a:To>
</s:Header>
<s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SessionCreate xmlns="http://www.otrs.org/TicketConnector/">
<UserLogin xmlns="">someUserName</UserLogin>
<Password xmlns="">somePassword</Password>
</SessionCreate>
</s:Body>
在服务器端发送消息
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<SessionCreateResponse xmlns="http://www.otrs.org/TicketConnector/">
<SessionID>SomeSessionID</SessionID>
</SessionCreateResponse>
</soap:Body>
</soap:Envelope>
Wireshark HTTP / XML包从服务器到我的客户端
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope soap:encodingStyle="http://www.w3.org/2003/05/soap-encoding"
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:soapenc="http://www.w3.org/2003/05/soap-encoding"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soap:Body>
<SessionCreateResponse xmlns="http://www.otrs.org/TicketConnector/">
<SessionID>SomeSessionID</SessionID>
</SessionCreateResponse>
</soap:Body>
</soap:Envelope>
Refernce.cs https://gist.github.com/HansVader/1ba3847d918ee15ef16703c8ada6c9bf
WSDL https://gist.github.com/HansVader/dd849e49f4a1584397cd21b0e430b301
我目前只需要SessionnCreate和TicketUpdate函数。其他操作此时无关紧要。如果您需要任何其他信息,请告诉我。
更新
我认为值得注意的是我创建了refernce.cs
我自己使用svcutil
工具,因为我遇到了IsWrapped的问题。看看这个问题和答案:
XmlSerializer attribute not valid in Web Service using WCF
答案 0 :(得分:1)
WSDL没有定义elementFormDefault:
<xsd:schema targetNamespace="http://www.otrs.org/TicketConnector/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
由于unqualified是默认值,因此会导致在生成的参考文件中使用Form = System.Xml.Schema.XmlSchemaForm.Unqualified修饰每个属性。
但是,由于为每个复杂对象指定了默认命名空间,因此XML序列化程序不会处理非限定属性。
解决方案
将架构元素更改为:
<xsd:schema targetNamespace="http://www.otrs.org/TicketConnector/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
另外,对于某些属性,顺序是错误的,因此需要将它们更改为(例如TickerCreateResponse):
<xsd:element name="TicketCreateResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element maxOccurs="1" minOccurs="1" name="ArticleID" type="xsd:positiveInteger"/>
<xsd:element maxOccurs="1" minOccurs="1" name="TicketID" type="xsd:positiveInteger"/>
<xsd:element minOccurs="1" name="TicketNumber" type="xsd:string"/>
<xsd:element maxOccurs="1" minOccurs="0" name="Error" type="tns:OTRS_Error"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
完成这些更改后,使用svcutil创建代理:
svcutil.exe / serializer:XmlSerializer GenericTicketConnectorSOAP.wsdl /o:OtrsConnector.cs / wrapped / n:*,otrs
使用配置:
<system.serviceModel>
<bindings>
<customBinding>
<binding name="GenericTicketConnector_Binding">
<textMessageEncoding messageVersion="Soap12" writeEncoding="utf-8" />
<httpTransport />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="http://localhost/otrs/nph-genericinterface.pl/Webservice/GenericTicketConnector"
binding="customBinding" bindingConfiguration="GenericTicketConnector_Binding"
contract="otrs.GenericTicketConnector_PortType" name="GenericTicketConnector_Port" />
</client>
</system.serviceModel>
之后它应该起作用,至少它对我有用。
希望它也适合你!