替换c#.net webservice中http请求正文中的无效字符

时间:2016-06-06 12:23:11

标签: c# .net json web-services deserialization

我使用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 \上进行迭代并抛出异常。

1 个答案:

答案 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。感谢您澄清有关" \"的评论。不是一个特殊的角色,服务合同是什么让我查找正确的东西。