- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
早上好,我在 .net 中有一个解决方案,我调用 saber bargain finder max 的网络服务。现在我想下载压缩后的信息,但响应对象返回 null。我读到你必须调用接口(interface) IClientMessageInspector BeforeSendRequest 和 AfterReceiveReply 但我不知道如何进行。有人会有关于它的例子或解决方案吗?谢谢
最佳答案
服务的响应无法处理压缩响应,所以是的,您必须放置中间件以便在继续之前处理解压缩。
首先,您需要将 BFM WSDL 作为服务导入,而不是作为 Web 服务,因此:
然后,我创建了 2 个类,一个将调用 BFM(“BFM_v410Service”),另一个用于中间件(“BFMInspector”)。
让我们从 BFMInspector 开始:
// The inspector class has to implement both IClientMessageInspector and IEndpointBehavior interfaces
public class BFMInspector : IClientMessageInspector, IEndpointBehavior
{
// This is the method to action after receiving a response from Sabre
public void AfterReceiveReply(ref Message reply, object correlationState)
{
try
{
// Get compressed response from reply and load that into a byte array.
XmlDictionaryReader bodyReader = reply.GetReaderAtBodyContents();
bodyReader.ReadStartElement("CompressedResponse");
byte[] bodyByteArray = bodyReader.ReadContentAsBase64();
// Create some helper variables
StringBuilder uncompressed = new StringBuilder();
String xmlString = "";
XmlDocument xmlPayload = new XmlDocument();
// Load the byte array into memory
using (MemoryStream memoryStream = new MemoryStream(bodyByteArray))
{
// Unzip the Stream
using (GZipStream gZipStream = new GZipStream(memoryStream, CompressionMode.Decompress))
{
byte[] buffer = new byte[1024];
int readBytes;
// Unzips character by character
while ((readBytes = gZipStream.Read(buffer, 0, buffer.Length)) != 0)
{
for (int i = 0; i < readBytes; i++)
// Append all characters to build the response
uncompressed.Append((char)buffer[i]);
}
}
xmlString = uncompressed.ToString();
xmlString = xmlString.Replace("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>", "");
}
// Convert the string into an XML
xmlPayload.LoadXml(xmlString);
// Create a new Message, which is what will substitute what was returned by Sabre
Message tempMessage = Message.CreateMessage(reply.Version, null, xmlPayload.ChildNodes[0]);
tempMessage.Headers.CopyHeadersFrom(reply.Headers);
tempMessage.Properties.CopyProperties(reply.Properties);
MessageBuffer bufferOfFault = tempMessage.CreateBufferedCopy(Int32.MaxValue);
// Replace the reply with the new Message
reply = bufferOfFault.CreateMessage();
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
// Nothing is done here, so we simply return null
return null;
}
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
// Nothing done
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
// Add "this" as an endpoint to be inspected
clientRuntime.MessageInspectors.Add(this);
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
// Nothing done
}
public void Validate(ServiceEndpoint endpoint)
{
// Nothing done
}
}
现在,BFM_v410Service:
// BFM calling class
public class BFM_v410Service
{
// The constructor and CreateRequest simeply create a complete request
private BargainFinderMaxRQRequest service;
private OTA_AirLowFareSearchRQ request;
public OTA_AirLowFareSearchRS response;
private string endpoint;
public BFM_v410Service(string token, string pcc, string convId, string endpoint)
{
CreateRequest(pcc, true);
this.endpoint = endpoint;
service = new BargainFinderMaxRQRequest()
{
MessageHeader = new BargainFinderMaxRQ_3_4_0_Srvc.MessageHeader()
{
From = new From()
{
PartyId = new PartyId[]
{
new PartyId()
{
Value = pcc
}
}
},
To = new To()
{
PartyId = new PartyId[]
{
new PartyId()
{
Value = endpoint
}
}
},
ConversationId = convId,
CPAId = pcc,
Service = new Service()
{
Value = "BargainFinderMaxRQ"
},
Action = "BargainFinderMaxRQ",
MessageData = new MessageData()
{
Timestamp = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssK")
}
},
OTA_AirLowFareSearchRQ = request,
Security = new Security()
{
BinarySecurityToken = token
}
};
}
private void CreateRequest(string pcc, bool compressed)
{
request = new OTA_AirLowFareSearchRQ()
{
Version = "3.4.0",
POS = new SourceType[]
{
new SourceType()
{
PseudoCityCode = pcc,
RequestorID = new UniqueID_Type()
{
ID = "1",
Type = "1",
CompanyName = new CompanyNameType()
{
Code = "TN",
Value = "TN"
}
}
}
},
OriginDestinationInformation = new OTA_AirLowFareSearchRQOriginDestinationInformation[]
{
new OTA_AirLowFareSearchRQOriginDestinationInformation()
{
RPH = "1",
Item = "2018-09-21T11:00:00",
ItemElementName = ItemChoiceType.DepartureDateTime,
OriginLocation = new OriginDestinationInformationTypeOriginLocation()
{
LocationCode = "MVD"
},
DestinationLocation = new OriginDestinationInformationTypeDestinationLocation()
{
LocationCode = "KRK"
}
},
new OTA_AirLowFareSearchRQOriginDestinationInformation()
{
RPH = "2",
Item = "2018-09-28T11:00:00",
ItemElementName = ItemChoiceType.DepartureDateTime,
OriginLocation = new OriginDestinationInformationTypeOriginLocation()
{
LocationCode = "KRK"
},
DestinationLocation = new OriginDestinationInformationTypeDestinationLocation()
{
LocationCode = "MVD"
}
}
},
TravelerInfoSummary = new TravelerInfoSummaryType()
{
AirTravelerAvail = new TravelerInformationType[]
{
new TravelerInformationType()
{
PassengerTypeQuantity = new PassengerTypeQuantityType[]
{
new PassengerTypeQuantityType()
{
Code = "ADT",
Quantity = "1"
}
}
}
}
},
TPA_Extensions = new OTA_AirLowFareSearchRQTPA_Extensions()
{
IntelliSellTransaction = new TransactionType()
{
RequestType = new TransactionTypeRequestType()
{
Name = "50ITINS"
},
CompressResponse = new TransactionTypeCompressResponse()
{
Value = compressed
}
}
}
};
}
public void Execute()
{
try
{
// Instanciate the Inspector
BFMInspector inspector = new BFMInspector();
// Select the URL you'll be sending the request. I've passed this as a parameter in the constructor
EndpointAddress url = new EndpointAddress(new Uri(endpoint));
// Create a binding, with a couple of characteristics, because of the size of the response
Binding binding = new BasicHttpsBinding()
{
MaxReceivedMessageSize = Int32.MaxValue,
MaxBufferSize = Int32.MaxValue
};
// Create the executable the BargainFinderMaxPortTypeClient variable, which will allow me to call the service
BargainFinderMaxPortTypeClient execute = new BargainFinderMaxPortTypeClient(binding, url);
// Add the middleware. Here's where ApplyClientBehavior is called behind the scene and adds itself
execute.Endpoint.EndpointBehaviors.Add(inspector);
// Call BFM and successfully get the response as an OTA_AirLowFareSearchRS object
response = execute.BargainFinderMaxRQ(ref service.MessageHeader, ref service.Security, request);
Console.WriteLine(response);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
然后,只需从控制台应用程序调用它:
static void Main(string[] args)
{
System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
string token = @"Shared/IDL:IceSess\/SessMgr:1\.0.IDL/Common/!ICESMS\/RESA!ICESMSLB\/RES.LB!-3146624380791354996!413892!0!1!E2E-1";
string pcc = "XXXX";
string convId = "HERE GOES YOUR CONVERSATION ID";
string endpoint = "https://webservices.havail.sabre.com";
BFM_v410Service bfm340 = new BFM_v410Service(token, pcc, convId, endpoint);
bfm410.Execute();
}
希望这对您有所帮助!
关于c# - 响应 Bargain Finder Max Compress c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49070535/
您知道,有时当您关闭 Finder 窗口或文档时,它会缩小到 Finder 中的显示位置。我希望我的应用程序也能够做到这一点。有这方面的API吗?我找不到。 最佳答案 执行摘要:如果您想要这种行为,请
我是 MAC 开发的新手,使用 finder 同步扩展并成功地为文件和文件夹设置了徽章图标,但我的问题是,当我完成将任何文件或文件夹同步到服务器时,徽章图标不会将表单同步更改为完成状态。请给我任何建议
在我的应用程序中,我喜欢让 OSX Finder 复制文件或文件夹。 (注意:我有充分的理由使用 Finder 而不是使用 shell cmds、NSWorkspace 或其他方式,因此无需在该方向上
我创建了一个简单的 Finder Sync (FinderSync) 扩展 (appex),默认情况下,应用程序沙盒处于打开状态(在 .entitlements com.apple.security.
我已经阅读了有关此主题的关于Stackoverflow的另一篇文章,但这几乎是所有基于Windows的工具。我当前正在运行Mac,在提到的所有工具中,http://xpath.alephzarro.c
我正在使用GORM查找器,但遇到运行时错误,我认为那是因为我的语法不正确。这是我遇到问题的代码行: def accountsOwnedByUser = AccountRecord.findAllWhe
我在 iPhone 上运行 iOS 应用程序,并记录了文档目录和 .plist 文件路径。刚刚更改了数据模型,所以我需要进入我的 .plist 并删除原始文件。 转到 Finder,按 Command
我目前正在开发一个实用程序,需要在对用户的默认设置进行一些更改后重新启动 Finder。 为了安全起见,我想在调用killall Finder(通过NSTask)之前检查Finder是否忙。如果 Fi
如何从特定文件夹中的 python 启动新的 Finder 窗口(或 Win 上的资源管理器)。我正在寻找的行为相当于 iTunes 或大多数其他程序想到它的轨道上下文菜单中的“在查找器中显示”链接。
进程文件: finder or finder.exe 进程名称: Microsoft Office Advanced Find Facility 进程类别:存在安全风险的进程 英文描述: f
我从 Swift 开始,我想创建一个应用程序来在 Finder 中加载选定的文件并执行一些操作,例如在 AppleScript 中。 糟糕的是我找不到任何关于如何做的信息。 在 AppleScript
我想从终端打开 Finder,并选择一个特定的文件。我知道通过使用 open .我可以在 Finder 中打开当前目录,但我也想在 Finder 窗口中选择一些文件。 我想要做的基本事情是运行一个脚本
我正在尝试使用 AppleScript 在 Finder 中打开一个文件夹。以下是我的代码。我想要文件夹 WorkSpace在 Finder 中打开,但它会打开父文件夹 /Volumes/MyMacD
我尝试使用 Application Scripting Bridge 让我的 Mac 进入休眠状态。代码如下所示: #import "Finder.h" FinderApplication *Fin
所以,我正在开发一个显示有关当前计算机的一些信息的应用程序,我希望它与 Finder 非常相似。当您在 Finder 中的计算机上获取信息时,会出现一个带有计算机大图标的预览部分。我希望能够在我的代码
我创建一个 cocoa 应用程序项目,并添加目标“Finder同步扩展”。然后“finderSync.appex”将被放入“.../Contens/Plugins/”文件夹中。但是当我启动应用程序时,
我希望能够为一些具有自定义扩展名的图像文件(例如,实际上是 TIFF 的 .canon 文件)生成自己的缩略图,以便 Finder 可以使用它们。 我不想更改文件内容(我对嵌入的 tiff 缩略图也不
我想要获取文件的“Kind”查找器。例如,对于文件“foo.css”,我想要字符串“CSS样式表”。 到目前为止,我正在做这样的事情: NSURL *fileURL = [[NSURL alloc]
通常为了分发一个简单的 cocoa 应用程序,我们对其发布文件夹进行 dmg 处理。当我们双击它时,它会安装其图像并显示一个不可编辑的窗口,其中包含 .app 和/或其他文件(例如 dSYM)。现在出
如何制作一个与 Finder 窗口具有相同基本结构的窗口(左侧的菜单/源列表,带有可以组织的图标,右侧的较大 View 中的内容)? 最佳答案 要复制 Finder 的内容 View ,请使用: 图标
我是一名优秀的程序员,十分优秀!