[英]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.