나는 POC (windows 프로젝트)를 구축 중이며 saber 세션 생성 요청을 호출하려고합니다. WSDL 생성을위한 sts url을 가지고 있고 Visual Studio 2015에서 프록시 클래스를 생성 할 수 있습니다. http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl 링크를 사용하여 .net 4.5를 사용할 수 있습니다. 이제 Saber는 내 회사의 사용자 ID와 비밀번호를 supllied했습니다. 게시물에 "Consuming Sabre soap services using .net"과 같은 요청을했는데 행운을 얻지 못했습니다. 새 CRT URL에서 서비스를 호출 할 때 프록시 클래스 객체가 오류를 던지고 있습니다. (https://sws-crt-as.cert.havail.sabre.com). 예외 : "System.ServiceModel.Security.SecurityNegotiationException : 권한 'sws-crt-as.cert.havail.sabre.com'을 사용하여 SSL/TLS에 대한 보안 채널을 설정할 수 없습니다. ---> System.Net.WebException : 요청 중단되었습니다 : SSL/TLS 보안 채널을 만들 수 없습니다. " 여기에는 예외의 InternalSTatus 속성을 "RequestFatal"로 나타내는 내부 예외 (외부 예외와 동일한 텍스트 포함)가 있습니다. 의 app.config의 콘텐츠는 참조 용 주어진다뿐만 아니라Sabre SOAP 세션 생성이 .net 4.5에서 실패했습니다.
세션의 작성 시점에
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="SessBehavior">
<clientCredentials>
<clientCertificate storeLocation="LocalMachine" storeName="TrustedPublisher" x509FindType="FindByThumbprint" findValue="E3FC0AD84F2F5A83ED6F86F567F8B14B40DCBF12" /><!--EV SSL CA G3-->
</clientCredentials>
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<customBinding>
<binding name="SessionCreateSoapBinding">
<textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16" messageVersion="Soap11" writeEncoding="utf-8">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
</textMessageEncoding>
<httpsTransport maxReceivedMessageSize="20000000" maxBufferSize="20000000" maxBufferPoolSize="20000000" />
</binding>
</customBinding>
</bindings>
<client>
<endpoint address="https://sws-crt-as.cert.havail.sabre.com"
behaviorConfiguration="SessBehavior"
binding="customBinding"
bindingConfiguration="SessionCreateSoapBinding" contract="SessionCreate.SessionCreatePortType"
name="SessionCreatePortType" />
</client>
</system.serviceModel>
코드 (Web.config의/코드에서 가능) 실수를 제발 도와주세요 :
public SabreSessionInfo sabreCreateSession(string user, string pass, string pseudo, string org, bool doGetAirVendors)
{
SabreSessionInfo inf = new SabreSessionInfo();
try
{
string userName = user;
string password = pass;
string PCC = pseudo;
string domain = "LA";
DateTime dt = DateTime.UtcNow;
string tstamp = dt.ToString("s").Replace("-","").Replace(":","") + "Z";
SessionCreate.MessageHeader msgHeader = new SessionCreate.MessageHeader();
msgHeader.ConversationId = tstamp;
SessionCreate.From from = new SessionCreate.From();
SessionCreate.PartyId fromPartyId = new SessionCreate.PartyId();
SessionCreate.PartyId[] fromPartyIdArr = new SessionCreate.PartyId[1];
fromPartyId.Value = "99999";
fromPartyIdArr[0] = fromPartyId;
from.PartyId = fromPartyIdArr;
msgHeader.From = from;
SessionCreate.To to = new SessionCreate.To();
SessionCreate.PartyId toPartyId = new SessionCreate.PartyId();
SessionCreate.PartyId[] toPartyIdArr = new SessionCreate.PartyId[1];
toPartyId.Value = "123123";
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 = "AnyCPA";
msgHeader.Action = "SessionCreateRQ";// Web method name
SessionCreate.Service service = new SessionCreate.Service();
service.Value = "Session";
msgHeader.Service = service;
SessionCreate.MessageData msgData = new SessionCreate.MessageData();
msgData.MessageId = "mid:" + tstamp + "@clientofsabre.com";
msgData.Timestamp = tstamp;
msgHeader.MessageData = msgData;
SessionCreate.Security security = new SessionCreate.Security();
SessionCreate.SecurityUsernameToken securityUserToken = new SessionCreate.SecurityUsernameToken();
securityUserToken.Username = userName;
securityUserToken.Password = password;
securityUserToken.Organization = org;
securityUserToken.Domain = domain;
security.UsernameToken = securityUserToken;
SessionCreate.SessionCreateRQ req = new SessionCreate.SessionCreateRQ();
SessionCreate.SessionCreateRQPOS pos = new SessionCreate.SessionCreateRQPOS();
SessionCreate.SessionCreateRQPOSSource source = new SessionCreate.SessionCreateRQPOSSource();
source.PseudoCityCode = PCC;
pos.Source = source;
req.POS = pos;
SessionCreate.SessionCreatePortTypeClient clientObj = new SessionCreate.SessionCreatePortTypeClient("SessionCreatePortType");
Task<SessionCreate.SessionCreateRQResponse> resp = clientObj.SessionCreateRQAsync(msgHeader, security, req);
resp.Wait();
inf.conversationID = msgHeader.ConversationId;
inf.sabreToken = security.BinarySecurityToken;
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.ToString());
}
return inf;
}
그 하나의 경이로운 선이 내 이틀간의 투쟁을 끝냈다. 도움을 주셔서 대단히 감사합니다. – Narasimham
나는 똑같이 직면했다! :) – Wisdoom