我使用aspera企业服务器/ aspera connect来上传用户。此解决方案提供对这些上载的启动/停止验证,并将JSON格式的http请求发送到我可以指定的Web服务。
问题在于所有这些都已设置,因此aspera使用域用户进行身份验证,此域用户保存为" TD \ asperaTransfer"而且似乎我无法改变用户的注释,并且aspera软件在序列化数据之前/同时不会对它进行清理。
这意味着我的网络服务会收到一个这样的主体的请求:
{
"startstop": "stop",
"session_id": "99eb1fac-da7b-41ac-83ee-b3c5f6973210",
"host": "10.22.64.6",
"client_ip": "10.20.21.80",
"user": "TD\asperaTransfer",
"user_id": "0",
"direction": "recv",
"target_rate_kbps": "1000",
"min_rate_kbps": "0",
"rate_policy": "fair",
"cipher": "aes-128",
"file": "F:\\UploadTest\\Penn and Teller explain Sleight of hand.mp4",
"size": "2318300",
"start_byte": "0",
"end_byte": "2318300",
"file_name_encoding": "utf8",
"file_csum_type": "none",
"cookie" : "True|c4308ab7-5772-4549-b2ae-8145d1e43230|master_cbc9d569-4154-4b10-8b3b-5fe8e68197b1.mp4"
}
正如您所见,文件路径已正确转义。这是因为软件的另一部分设置了请求中的文件路径。仍然是域名" \"没有被转义,因此每次.net尝试以任何方式反序列化我得到XmlException
"意想不到的字符''""。
所以我的问题是:
有没有办法可以替换" TD \ asperaTransfer"正确转义" TD \\ asperaTransfer"或者任何不反序列化的方法,但只是检索我可以使用的主体的字符串表示?
我的最后一次尝试是创建一个实现MessageInspector
的{{1}}类,并用IDispatchMessageInspector
方法替换正文。
我仍然遇到这样的问题:我不知道如何在不使用某种反序列化器的情况下获取正文内容,然后再次抛出AfterReceiveRequest()
。
编辑:
所以是 - 正文是一个json格式的字符串,但.NET接收HTTP请求的方式是作为XML-Soap-Envelope中的Message对象,所以要接收正文字符串我必须使用XML反序列化器,但是当我这样做时,我得到XML异常。抱歉XML / Json混淆。
我也觉得奇怪的是我得到了一个XML-Exception,但它说"无效的字符''""" - 如果我用另一个请求测试它,比如TD \ zoolander,那么它说无效字符是' z'所以我认为它与反斜杠有关,尽管它并不算作XML中的转义字符。
如果有一种方法甚至在此之前检索HTTP请求并将其保存为日志,以便您可以将其用于调试目的 - 这就是我想要做的,但无法获得.NET这样做的框架,因为它将HTTP请求包装在Message对象中,因此也包含在XML中。
我甚至不需要整个身体,只需要" cookie"键。剩下的对我来说没用,但即使试图跳转到它,它会在TD \上进行迭代并抛出异常。
答案 0 :(得分:0)
所以问题是我已经为aspera中旧数据中心的webservice编写的自定义内容类型映射器,因为HTTP请求也没有内容类型集。因此,对于.NET来反序列化请求,我将contenttype设置为JSON,而不管标题中的内容是什么。
对于messageInspector,我将其设置回原始(删除可能也会有帮助)
在AfterReceiveRequest中,我现在读了这样的请求:
private string ReadRawBody(ref Message message)
{
XmlDictionaryReader bodyReader = message.GetReaderAtBodyContents();
bodyReader.ReadStartElement("Binary");
byte[] bodyBytes = bodyReader.ReadContentAsBase64();
string messageBody = Encoding.UTF8.GetString(bodyBytes);
// Now to recreate the message
MemoryStream ms = new MemoryStream();
XmlDictionaryWriter writer = XmlDictionaryWriter.CreateBinaryWriter(ms);
writer.WriteStartElement("Binary");
writer.WriteBase64(bodyBytes, 0, bodyBytes.Length);
writer.WriteEndElement();
writer.Flush();
ms.Position = 0;
XmlDictionaryReader reader = XmlDictionaryReader.CreateBinaryReader(ms, XmlDictionaryReaderQuotas.Max);
Message newMessage = Message.CreateMessage(reader, int.MaxValue, message.Version);
newMessage.Properties.CopyProperties(message.Properties);
message = newMessage;
return messageBody;
}
使用我可以使用的主体的字符串表示,替换TD \ asperaTransfer,然后像过去一样处理请求。
问题是一个自定义内容类型映射器,它始终将内容类型设置为json,因此.NET尝试将其反序列化为json。感谢您澄清有关" \"的评论。不是一个特殊的角色,服务合同是什么让我查找正确的东西。