WCF Webservice始终返回null

时间:2016-04-09 21:40:31

标签: c# xml web-services wcf soap

我正在使用我们的票务系统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函数。其他操作此时无关紧要。如果您需要任何其他信息,请告诉我。

更新

以下是评论中建议的跟踪工具的跟踪,例如yildizm85: Outgoing SOAP message

Incoming SOAP message

我认为值得注意的是我创建了refernce.cs 我自己使用svcutil工具,因为我遇到了IsWrapped的问题。看看这个问题和答案: XmlSerializer attribute not valid in Web Service using WCF

1 个答案:

答案 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>

之后它应该起作用,至少它对我有用。

希望它也适合你!