2016-04-09 30 views
0

Bilet sistemimiz OTRS'den SOAP web servisi alıyorum. Bu yüzden Web servisi gerçekten kontrolüm altında değil. İstek çok iyi çalışıyor, ancak Kodumda asla yanıt alamıyorum. Cevap her zaman boş. (var response = client.SessionCreate(session);) Garip olan şu ki, bu bilet sisteminin wireshark ve web servis konsolu, geçerli bir cevap almam gerektiğini söylüyor. Bu web servis hizmetine çok yeniyim, bu yüzden bu durumda nereden başlayacağımı kesinlikle bilmiyorum. İşte burada yaptığım bir açıklama. Herhangi bir öneri gerçekten takdir edilmektedir.WCF Web hizmeti her zaman sıfırlanıyor

İlk önce normal bir C# projesi oluşturdum ve yalnızca OTRS projesinin GitHub site web sitesinde bulunan WSDL dosyasını ekledim. Servis Referansı olarak ekledim ve buna benzeyen C# kodumu ekledim.

// Hata Ayıklaması için System.Net.ServicePointManager.Expect100Continue = false; Thread.CurrentThread.CurrentUICulture = new CultureInfo ("en-us"); serverside de

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(); 
} 

Gelen mesaj

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

serverside de

Giden mesaj

<?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 müvekkilime sunucudan gidiş HTTP/XML paketi

<?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 Şu anda sadece SessionnCreate ve TicketUpdate işlevini ihtiyaç https://gist.github.com/HansVader/dd849e49f4a1584397cd21b0e430b301

https://gist.github.com/HansVader/1ba3847d918ee15ef16703c8ada6c9bf

WSDL. Diğer operasyonlar bu noktada zamanla ilgisizdir. Başka bilgiye ihtiyacınız varsa lütfen bize bildirin.

Güncelleme: İşte

olan yildizm85 gibi iz aracından izleri Yorum önerilen: Outgoing SOAP message

Incoming SOAP message

Ben de ben tarafından refernce.cs yarattığı dikkati çekiyor düşünüyorum Kendim svcutil aracıyla, çünkü IsWrapped ile bir sorunum vardı. Bu soruya bir göz atın ve cevap: XmlSerializer attribute not valid in Web Service using WCF

+0

WCF izlemeyi denediniz mi? https://msdn.microsoft.com/en-us/library/ms751526.aspx –

+0

Gönderdiğiniz mesajın doğru olduğuna ve geri aldığınız mesaja benziyor. İsim alanlarını biraz kontrol ettim ve ilk görüşte iyi görünüyor. Bununla birlikte, serileştirme çalışmaz gibi görünmüyor, bu yüzden WSDL'den yanlış bir şey üretiliyor olabilir veya WSDL yanlıştır. Hizmet referansını birkaç kez eklemeyi denediniz mi (ekleme ve silme) veya referans.cs'deki herhangi bir şeyi değiştirdiniz mi? – Cosmin

+0

ServiceStack.net - gerçekten iyi bir web servis kitaplığına bakın. İndirme sayfalarının altında daha eski bir açık kaynak sürümü var. –

cevap

1

WSDL elementFormDefault tanımlamıyor:

<xsd:schema targetNamespace="http://www.otrs.org/TicketConnector/" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

vasıfsız varsayılan olduğundan, bu form = System.Xml.Schema süslenmiş olan her özellik neden olur. Oluşturulan referans dosyasında XmlSchemaForm.Unqualified.

Ancak, her karmaşık nesne için varsayılan bir ad alanı bulunduğundan, XML serializer nitelenmemiş özellikleri işlemez.

çözüm

Değişim için şema elemanı: özelliklerinden bazıları için

<xsd:schema targetNamespace="http://www.otrs.org/TicketConnector/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> 

Ayrıca, sipariş yanlış, bu yüzden (örneğin TickerCreateResponse için) için değiştirilmesi gerekir :

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

bu değişikliklerden sonra, Svcutil kullanarak proxy oluşturmak:

svcutil.exe/sıralandırıcı: XmlSerializer GenericTicketConnectorSOAP.wsdl /o:OtrsConnector.cs/sarılmış/n: *, OTRS

Ve yapılandırma kullanarak:

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

Bundan sonra çalışmalı, en En azından benim için yaptı.

Umut sizin için de işe yarıyor!