2017-10-16 34 views
0

私はPOC(Windowsプロジェクト)を構築しており、saberセッションの作成要求を呼び出そうとしています。私はWSDLを生成するためのsts URLを持っており、Visual studio 2015でプロキシクラスを生成でき、http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdlというリンクを使用して.net 4.5で生成できます。今私は私の会社のユーザー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をコンテンツはポイントに(web.configファイル/コードで可能)ミスを助けてください Saber SOAPセッションの作成が.net 4.5で失敗しました

参考のためにここに与えられただけでなく

<system.serviceModel> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="SessBehavior"> 
      <clientCredentials> 
      &lt;clientCertificate storeLocation="LocalMachine" storeName="TrustedPublisher" x509FindType="FindByThumbprint" findValue="E3FC0AD84F2F5A83ED6F86F567F8B14B40DCBF12" /><!--EV SSL CA G3--> 
      &lt;/clientCredentials> 
     &lt;/behavior> 
     &lt;/endpointBehaviors> 
    &lt;/behaviors> 
    &lt;bindings> 
     &lt;customBinding> 
     &lt;binding name="SessionCreateSoapBinding"> 
      &lt;textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16" messageVersion="Soap11" writeEncoding="utf-8"> 
      &lt;readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" /> 
      &lt;/textMessageEncoding> 
      &lt;httpsTransport maxReceivedMessageSize="20000000" maxBufferSize="20000000" maxBufferPoolSize="20000000" /> 
     &lt;/binding> 
     &lt;/customBinding> 
    &lt;/bindings> 
    &lt;client> 
     &lt;endpoint address="https://sws-crt-as.cert.havail.sabre.com" 
       behaviorConfiguration="SessBehavior" 
       binding="customBinding" 
      bindingConfiguration="SessionCreateSoapBinding" contract="SessionCreate.SessionCreatePortType" 
      name="SessionCreatePortType" /> 
    &lt;/client> 
    &lt;/system.serviceModel> 

セッションを作成するためのコード:

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; 
} 

答えて

2

問題は、URLがデフォルトで有効になっていないTLS 1.2のみを受け入れることです。あなたがインスタンス化さSessionCreateオブジェクトを実行するクラスで

、以下の行を追加します。これは、それを解決する必要があり System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

+0

私の2日間の闘いは、その1つの不思議な線で終わった。助けてくれてありがとうございました。 – Narasimham

+0

私は同じことに直面している! :) – Wisdoom

関連する問題