我正在尝试使用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错误代码。代码是否有任何问题或者如果错误请提供正确的终点是错误的。
答案 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
希望有所帮助。