gpt4 book ai didi

c# - 使用 .net 使用 Sabre soap 服务

转载 作者:太空宇宙 更新时间:2023-11-03 12:50:01 24 4
gpt4 key购买 nike

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

 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 并从那里使用网络服务。

假设您将代理类命名空间命名为 SabreSesh,那么这样的事情应该可行。

另外可能值得注意的是,当从 saber 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 = "";
}
}

关于c# - 使用 .net 使用 Sabre soap 服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35897341/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com