C# Visual Studio-Sabre GetReservations不在Intellisense中显示旅行项目
我正在尝试实现新的GetReservationRQ/RS API,因为旧的TravelInvestureReadRQ显然将在2018年12月日落 我能够进行调用并获得响应,所有有效的旅行数据都存在于XML有效负载中,但我无法让Intellisense在代理类的Item字段中显示项目。我可能解释错了,所以下面有一些截图 我试着通过WSDL创建的reference.cs文件进行挖掘,我确实看到了GetReservationRQ和TravelCinerarreAdRQ之间对象模型创建方式的一些差异,但我不知道该怎么做 调试模式下填充的对象,显示所有有效保留项: Intellisense显示没有任何其他可见成员的项目字段: 2018年7月26日编辑 多亏了Carlos下面的回答,我通过实施他的更改实现了这一点。对于子孙后代,以下是我的工作代码: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之间对象模型创建方式的一些差异,但
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生成类的方式,您应该像前面所说的那样查看允许的类型。我建议您为发现此行为的对象创建一个工厂,以便在无法找到预期类型时更容易处理和集中行为。