C# Visual Studio-Sabre GetReservations不在Intellisense中显示旅行项目

C# Visual Studio-Sabre GetReservations不在Intellisense中显示旅行项目,c#,visual-studio,wsdl,soap-client,sabre,C#,Visual Studio,Wsdl,Soap Client,Sabre,我正在尝试实现新的GetReservationRQ/RS API,因为旧的TravelInvestureReadRQ显然将在2018年12月日落 我能够进行调用并获得响应,所有有效的旅行数据都存在于XML有效负载中,但我无法让Intellisense在代理类的Item字段中显示项目。我可能解释错了,所以下面有一些截图 我试着通过WSDL创建的reference.cs文件进行挖掘,我确实看到了GetReservationRQ和TravelCinerarreAdRQ之间对象模型创建方式的一些差异,但

我正在尝试实现新的GetReservationRQ/RS API,因为旧的TravelInvestureReadRQ显然将在2018年12月日落

我能够进行调用并获得响应,所有有效的旅行数据都存在于XML有效负载中,但我无法让Intellisense在代理类的Item字段中显示项目。我可能解释错了,所以下面有一些截图

我试着通过WSDL创建的reference.cs文件进行挖掘,我确实看到了GetReservationRQ和TravelCinerarreAdRQ之间对象模型创建方式的一些差异,但我不知道该怎么做

调试模式下填充的对象,显示所有有效保留项:

Intellisense显示没有任何其他可见成员的项目字段:

2018年7月26日编辑

多亏了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;
        }
    }
}

正如您在上次打印屏幕中看到的,Item属性的类型为Object。这意味着您需要将其强制转换为所需的特定类型


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

太好了-非常感谢!这需要对演员阵容进行一些调整,但我认为通过将响应压缩到一个“ReservationPNRB”对象类型中,我得到了我所需要的。我很高兴它能工作,请注意,这个Item对象可以返回几种类型,不仅是您期望的类型,因此请确保首先验证它。接下来,原始类型转换确实有效,我可以正确返回大量数据,但我在嵌套对象类中遇到了相同的问题。例如,我可以拉回一个段列表,但在段列表中,每个“项”字段仍然作为通用“对象”类型列出。当我试着把它放到我认为是较低级别的班级时,我仍然看不到Intellisense中的班级成员。这是一个WSDL问题,还是我只是一个彻头彻尾的傻瓜,在这里遗漏了什么?在这里我回答了我自己的问题,因为我在参考文件中找到了泛型类型,它使用“[System.Xml.Serialization.xmlementAttribute(“Air”,typeof(SegmentTypePNRBSegmentAir))”来指示允许的类型。我仍在苦苦思索为什么数据是这样组织的,但我想我理解它是如何工作的。我想我只需要继续对我得到的每一件物品进行铸造,并围绕这一点进行工作。再次感谢你的帮助Carlos别提drtrobridge,但是是的,这是.net proxy为Sabre生成类的方式,您应该像前面所说的那样查看允许的类型。我建议您为发现此行为的对象创建一个工厂,以便在无法找到预期类型时更容易处理和集中行为。