簡體   English   中英

使用 .net 使用 Sabre 肥皂服務

[英]Consuming Sabre soap services using .net

我正在嘗試使用 SessionCreateRQ 肥皂服務創建會話。 這是使用 sabre soap 服務的第一步,我在其中創建了 HttpWebRequest 對象和端點https://sws3-crt.cert.sabre.com並傳遞從 sabre 文檔中復制的請求 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 錯誤代碼。 代碼是否有問題或端點錯誤,如果錯誤請提供正確的。

假設您使用 Visual Studio 使用網絡參考而不是服務參考。 服務引用似乎創建了類的不良代理表示。

您可以通過右鍵單擊服務引用來執行此操作。

轉到右下角的高級選項,然后單擊添加 Web 參考。 然后輸入 WSDL URL 並從那里使用 web 服務。

然后,假設您將代理類命名空間命名為 SabreSesh,類似這樣的事情應該可以工作。

還可能值得注意的是,當從 sabre 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 = "";
        }
    }

Dev Studio 中有一個現有的 .NET 示例,使用代理代碼/類:

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

希望有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM