【问题标题】:Visual Studio - Sabre GetReservationRS not showing travel items in IntellisenseVisual Studio - Sabre GetReservationRS 未在 Intellisense 中显示旅行项目
【发布时间】:2018-07-20 20:51:05
【问题描述】:

我正在尝试实施新的 GetReservationRQ/RS API,因为旧的 TravelItineraryReadRQ 显然将于 2018 年 12 月停用。

我能够拨打电话并获得响应,并且所有有效的旅行数据都存在于 XML 有效负载中,但我无法让 Intellisense 显示代理类的 Item 字段中的项目。我可能解释不正确,所以我在下面有一些屏幕截图。

我已尝试深入研究由 WSDL 创建的 reference.cs 文件,并且确实看到 GetReservationRQ 和 TravelItinerarReadRQ 之间创建对象模型的方式存在一些差异,但我不知道该怎么做它。

处于调试模式的填充对象显示所有有效的预留项:

智能感知显示没有任何其他可见成员的项目字段:

编辑 7/26/18

感谢 Carlos 在下面的回答,我通过实施他的更改来完成这项工作。对于后代,这是我的工作代码:

public class GetReservationReq
{

    private GetReservationService service;
    public GetReservationRS response;
    public string xmlResponse;

    public GetReservationReq()
    {
        //parameterless constructor for serializiation
    }

    public GetReservationReq(SessionToken token, string locator)
    {
        //MessageHeader
        MessageHeader mHeader = new MessageHeader();

        PartyId[] pId = { new PartyId() };
        pId[0].Value = "SWS";

        From from = new From();
        from.PartyId = pId;

        To to = new To();
        to.PartyId = pId;

        mHeader.Action = "getReservationRQ";
        mHeader.Service = new Service()
        {
            Value = mHeader.Action
        };
        mHeader.ConversationId = token.conversationID;
        mHeader.CPAId = token.ipcc;
        mHeader.From = from;
        mHeader.To = to;
        mHeader.MessageData = new MessageData()
        {
            Timestamp = DateTime.UtcNow.ToString()
        };

        //Security
        Security sec = new Security();
        //Security1 sec = new Security1();
        sec.BinarySecurityToken = token.securityToken;

        //Service
        service = new GetReservationService();
        service.MessageHeaderValue = mHeader;
        service.SoapVersion = System.Web.Services.Protocols.SoapProtocolVersion.Soap11;
        service.SecurityValue = sec;

        //create the request
        GetReservationRQ req = new GetReservationRQ();
        req.Version = "1.18.0";
        req.RequestType = "Stateful"; //This indicates that we are looking to pull up an existing PNR
        req.Locator = locator;
        req.ReturnOptions = new ReturnOptions();
        req.ReturnOptions.ViewName = "Full";
        req.ReturnOptions.ResponseFormat = "STL";


        try
        {
            //execute the response
            response = service.GetReservationOperation(req);
            //cast response items to usable Object 
            ReservationPNRB content = (ReservationPNRB)response.Item;
            //testing - iterate through reservation elements and do stuff
            foreach (var segment in content.OpenReservationElements.OpenReservationElement)
            {
                Console.WriteLine(segment.id + " - " + segment.type);
            }
            Console.Read();

            //serialize the response for logging if necessary
            xmlResponse = Serializer.toXML(response);


            //serialize response for logging if necessary
            using (StreamWriter myWriter = new StreamWriter(@"C:\SABRE_DATA\TMP\xmlItin.txt", true))
            {
                XmlSerializer mySerializer = new XmlSerializer(typeof(GetReservationRS));
                mySerializer.Serialize(myWriter, response);
                StringWriter myStringWriter = new StringWriter();
                mySerializer.Serialize(myStringWriter, response);
                xmlResponse = myStringWriter.ToString();
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
            throw;
        }
    }
}

【问题讨论】:

    标签: c# visual-studio wsdl soap-client sabre


    【解决方案1】:

    正如您在上一个打印屏幕中看到的,Item 属性的类型是 Object。这意味着您需要将其转换为您期望的特定类型。

    要找到可以在该属性中返回的有效类型,您需要转到 reference.cs,在那里您将在属性顶部(作为属性)看到 API 可以返回的对象的有效类型在这个属性中。

    【讨论】:

    • 非常好 - 非常感谢!在演员阵容中花了一些时间,但我认为我可以通过将 response.Item 封装为“ReservationPNRB”对象类型来满足我的需要。
    • 我很高兴它成功了,请注意这个 Item 对象可以返回多种类型,而不仅仅是您期望的类型,因此请务必先验证它。
    • 跟进这一点 - 原始演员确实有效,我可以正确返回大量数据,但我在嵌套对象类中遇到了同样的问题。例如,我可以拉回一个段列表,但在段列表中,每个“项目”字段仍列为通用“对象”类型。当我尝试将其投射到我认为是较低级别的班级时,我仍然无法在 Intellisense 中看到班级成员。这是一个 WSDL 问题还是我只是一个彻头彻尾的笨蛋,在这里遗漏了什么?
    • 有点回答我自己的问题,因为我在参考文件中找到了泛型类型,它使用“[System.Xml.Serialization.XmlElementAttribute("Air", typeof(SegmentTypePNRBSegmentAir))]"指示允许的类型。我仍在为为什么以这种方式组织数据而苦苦挣扎,但我想我理解它是如何工作的。我想我只需要继续对我得到的每一个项目进行投射并解决这个问题。再次感谢您的帮助,卡洛斯。
    • 没有提到@drtrobridge,但是是的,这是.net代理为Sabre生成类的方式,你应该看看你对允许的类型所说的那样。我建议你创建一个工厂对于您发现此行为的对象,以便您在无法找到预期类型时更轻松地处理和集中行为。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-11
    • 2012-04-11
    • 1970-01-01
    相关资源
    最近更新 更多