【问题标题】:Sabre SOAP session creation failing in .net 4.5Sabre SOAP 会话创建在 .net 4.5 中失败
【发布时间】:2017-10-16 13:49:02
【问题描述】:

我正在构建一个 POC(Windows 项目)并尝试调用 sabre 会话创建请求。我有用于生成 WSDL 的 sts url,并且可以在 Visual Studio 2015 中生成代理类,使用链接 http://webservices.sabre.com/wsdl/sabreXML1.0.00/usg/SessionCreateRQ.wsdl 使用 .net 4.5。现在我有 Sabre 为我的公司提供用户 ID 和密码,我尝试将它们放在请求中,如帖子“Consuming Sabre soap services using .net”中建议的那样,但没有运气,因为代理类对象在调用新服务时抛出错误Sabre 的 CRT 网址 (https://sws-crt-as.cert.havail.sabre.com)。异常:“ System.ServiceModel.Security.SecurityNegotiationException:无法为 SSL/TLS 建立安全通道,权限为 'sws-crt-as.cert.havail.sabre.com'。---> System.Net.WebException:请求已中止:无法创建 SSL/TLS 安全通道。”。这里有任何内部异常(与外部异常具有相同的文本),将异常的 InternalSTatus 属性指示为“RequestFatal”。 app.config 的内容也在这里供参考

请帮我指出错误(可能在 web.config/code 中)

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

【问题讨论】:

    标签: c# .net web-services soap sabre


    【解决方案1】:

    问题在于该 URL 仅接受 TLS 1.2,默认情况下可能未启用。

    在您执行实例化的 SessionCreate 对象的类中,添加以下行: System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

    这应该可以解决。

    【讨论】:

    • 那一句神奇的台词结束了我两天的挣扎。非常感谢您的帮助。
    • 我也遇到过同样的情况! :)
    【解决方案2】:

    .NET 4.0 或更高版本上的 TLS 1.2
    System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;

    .NET 3.5 不支持 TLS 1.2,因此我们使用它的数字表示
    System.Net.ServicePointManager.SecurityProtocol = (System.Net.SecurityProtocolType)3072;

    【讨论】:

      猜你喜欢
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 1970-01-01
      • 2021-10-22
      • 2011-12-11
      • 1970-01-01
      相关资源
      最近更新 更多