使用.net消费Sabre肥皂服务

时间:2016-03-09 16:34:51

标签: c# .net soap sabre

我正在尝试使用SessionCreateRQ soap服务创建会话。 这是使用saber soap服务的第一步,我用端点 https://sws3-crt.cert.sabre.com 创建了HttpWebRequest的对象,并传递了从saber文档复制的请求xml以创建会话

 public HttpWebRequest CreateWebRequest()
        {
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(@"https://sws3-crt.cert.sabre.com");
            webRequest.Headers.Add(@"SOAP:Action");
            webRequest.ContentType = "text/xml;charset=\"utf-8\"";
            webRequest.Accept = "text/xml";
            webRequest.Method = "POST";
            return webRequest;
        }

public void Execute()
        {
            HttpWebRequest request = CreateWebRequest();
            XmlDocument soapEnvelopeXml = new XmlDocument();
            soapEnvelopeXml.LoadXml(@"<?xml version=""1.0"" encoding=""UTF-8""?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"" xmlns:eb=""http://www.ebxml.org/namespaces/messageHeader"" xmlns:xlink=""http://www.w3.org/1999/xlink"" xmlns:xsd=""http://www.w3.org/1999/XMLSchema"">
    <SOAP-ENV:Header>
        <eb:MessageHeader SOAP-ENV:mustUnderstand=""1"" eb:version=""1.0"">
            <eb:ConversationId/>
            <eb:From>
                <eb:PartyId type=""urn:x12.org:IO5:01"">999999</eb:PartyId>
            </eb:From>
            <eb:To>
                <eb:PartyId type=""urn:x12.org:IO5:01"">123123</eb:PartyId>
            </eb:To>
            <eb:CPAId>IPCC</eb:CPAId>
            <eb:Service eb:type=""OTA"">SessionCreateRQ</eb:Service>
            <eb:Action>SessionCreateRQ</eb:Action>
            <eb:MessageData>
                <eb:MessageId>1000</eb:MessageId>
                <eb:Timestamp>2016-03-09T11:15:12Z</eb:Timestamp>
                <eb:TimeToLive>2016-03-10T11:15:12Z</eb:TimeToLive>
            </eb:MessageData>
        </eb:MessageHeader>
        <wsse:Security xmlns:wsse=""http://schemas.xmlsoap.org/ws/2002/12/secext"" xmlns:wsu=""http://schemas.xmlsoap.org/ws/2002/12/utility"">
            <wsse:UsernameToken> 
                <wsse:Username>myUserName</wsse:Username>
                <wsse:Password>myPasswordenter code here</wsse:Password>
                <Organization>IPCC</Organization>
                <Domain>DEFAULT</Domain> 
            </wsse:UsernameToken>
        </wsse:Security>
    </SOAP-ENV:Header>
    <SOAP-ENV:Body>
        <eb:Manifest SOAP-ENV:mustUnderstand=""1"" eb:version=""1.0"">
            <eb:Reference xmlns:xlink=""http://www.w3.org/1999/xlink"" xlink:href=""cid:rootelement"" xlink:type=""simple""/>
        </eb:Manifest>
    </SOAP-ENV:Body>
</SOAP-ENV:Envelope>");

            using (Stream stream = request.GetRequestStream())
            {
                soapEnvelopeXml.Save(stream);
            }

            using (WebResponse response = request.GetResponse())
            {
                using (StreamReader rd = new StreamReader(response.GetResponseStream()))
                {
                    string soapResult = rd.ReadToEnd();
                    Console.WriteLine(soapResult);
                }
            }
        }

但在 request.GetResponse()上获得500错误代码。代码是否有任何问题或者如果错误请提供正确的终点是错误的。

2 个答案:

答案 0 :(得分:1)

假设您使用visual studio使用Web引用而不是服务引用。服务引用似乎会创建类的错误代理表示。

您可以通过右键单击服务引用来执行此操作。

转到右下角的高级选项,然后单击“添加Web引用”。然后输入WSDL URL并从那里使用web服务。

然后在假设您将代理类命名空间命名为SabreSesh的情况下应该这样做。

同样可能值得注意的是,当从军刀WSDL生成代理类时,有时你必须搜索和替换Reference.cs并将[] []替换为[],因为它有翻译列表的习惯和数组模式在不应该的情况下加倍数组。

     public SabreSessionInfo sabreCreateSession(string user, string pass, string pseudo, string iPseudo, bool doGetAirVendors)
                {
                    SabreSessionInfo inf = new SabreSessionInfo();

                    try
                    {
                        userName = user;
                        password = pass;

                        iPCC = iPseudo;
                        PCC = pseudo;

                        string domain = "DEFAULT";

                        DateTime dt = DateTime.UtcNow;
                        string tstamp = dt.ToString("s") + "Z";

                        SabreSesh.MessageHeader msgHeader = new SabreSesh.MessageHeader();

                        msgHeader.ConversationId = "TestSession";       // Set the ConversationId

                        SabreSesh.From from = new SabreSesh.From();
                        SabreSesh.PartyId fromPartyId = new SabreSesh.PartyId();
                        SabreSesh.PartyId[] fromPartyIdArr = new SabreSesh.PartyId[1];
                        fromPartyId.Value = "WebServiceClient";
                        fromPartyIdArr[0] = fromPartyId;
                        from.PartyId = fromPartyIdArr;
                        msgHeader.From = from;

                        SabreSesh.To to = new SabreSesh.To();
                        SabreSesh.PartyId toPartyId = new SabreSesh.PartyId();
                        SabreSesh.PartyId[] toPartyIdArr = new SabreSesh.PartyId[1];
                        toPartyId.Value = "WebServiceSupplier";
                        toPartyIdArr[0] = toPartyId;
                        to.PartyId = toPartyIdArr;
                        msgHeader.To = to;

                        //Add the value for eb:CPAId, which is the IPCC. 
                        //Add the value for the action code of this Web service, SessionCreateRQ.

                        msgHeader.CPAId = iPCC;
                        msgHeader.Action = "SessionCreateRQ";
                        SabreSesh.Service service = new SabreSesh.Service();
                        service.Value = "SessionCreate";
                        msgHeader.Service = service;

                        SabreSesh.MessageData msgData = new SabreSesh.MessageData();
                        msgData.MessageId = "mid:20001209-133003-2333@clientofsabre.com1";
                        msgData.Timestamp = tstamp;
                        msgHeader.MessageData = msgData;

                        SabreSesh.Security security = new SabreSesh.Security();
                        SabreSesh.SecurityUsernameToken securityUserToken = new SabreSesh.SecurityUsernameToken();
                        securityUserToken.Username = userName;
                        securityUserToken.Password = password;
                        securityUserToken.Organization = iPCC;
                        securityUserToken.Domain = domain;
                        security.UsernameToken = securityUserToken;

                        SabreSesh.SessionCreateRQ req = new SabreSesh.SessionCreateRQ();
                        SabreSesh.SessionCreateRQPOS pos = new SabreSesh.SessionCreateRQPOS();
                        SabreSesh.SessionCreateRQPOSSource source = new SabreSesh.SessionCreateRQPOSSource();
                        source.PseudoCityCode = iPCC;
                        pos.Source = source;
                        req.POS = pos;

                        SabreSesh.SessionCreateRQService serviceObj = new SabreSesh.SessionCreateRQService();
                        serviceObj.MessageHeaderValue = msgHeader;
                        serviceObj.SecurityValue = security;


                        lock (lockObject)
                        {

                            SabreSesh.SessionCreateRS resp = new SabreSesh.SessionCreateRS();
                            try
                            {
                                resp = serviceObj.SessionCreateRQ(req); // Send the request
                            }
                            catch (Exception ex)
                            {
                                System.Diagnostics.Debug.WriteLine(ex.ToString());
                            }


                        }





                        inf.conversationID = msgHeader.ConversationId;
                        inf.sabreToken = security.BinarySecurityToken;


                    }
                    catch (Exception ex)
                    {
                        System.Diagnostics.Debug.WriteLine(ex.ToString());
                    }

            return inf;
            }

 public class SabreSessionInfo
    {
        public string conversationID { get; set;}
        public string sabreToken { get; set; }

        public SabreSessionInfo()
        {
            conversationID = "";
            sabreToken = "";
        }
    }

答案 1 :(得分:0)

Dev studio中存在一个使用代理代码/类的.NET示例:

https://developer.sabre.com/docs/read/soap_basics/getting_started

希望有所帮助。