关于ServiceStack中JsonHttpClient使用Uri.ToString()是否为Bug及是否应替换为AbsoluteUri的技术问询
没错,你观察到的这个问题绝对是因误用Uri.ToString()导致的Bug,而且在ServiceStack的这个场景下,完全应该替换为AbsoluteUri来修复。
先给你拆解清楚问题的根源:
Uri.ToString()的设计就是返回URI的非转义规范形式,按照微软的文档,它会解码除了#、?、%之外的所有特殊字符。这就会直接破坏你原本编码好的查询参数——比如你案例里的%26(对应&)和%20(对应空格),都会被转成明文。- 而
Uri.AbsoluteUri则会严格保留你最初构造的、带有正确编码的完整URI字符串,不会随意解码参数里的特殊字符,能保证整个URL的结构和参数值的完整性。
结合你给出的实际案例来看:
原始URL:
https://somedomain/imagestream?locationCode=TitelDia&relativePath=Marketing%20en%20Sales&fileName=M%26S_titel_1.jpeg
经过new Uri(absoluteUrl).ToString()处理后,变成了:https://somedomain/imagestream?locationCode=TitelDia&relativePath=Marketing en Sales&fileName=M&S_titel_1.jpeg
这就直接导致服务器端解析参数时出问题:fileName参数里的&被当成了新参数的分隔符,所以服务器只拿到了M,完全丢失了后面的S_titel_1.jpeg部分,这显然是完全不符合预期的错误行为。
而且你不是第一个遇到这个问题的人,很多开发者都反馈过,在网络请求场景下使用Uri.ToString()几乎必然会引发Bug——因为它的解码逻辑完全不适合用来生成要发送给服务器的请求URL。
所以结论很明确:ServiceStack的JsonHttpClient里使用Uri.ToString()确实是一个Bug,必须替换为Uri.AbsoluteUri才能保证请求URL的正确性,避免出现参数截断、解析错误这类问题。
内容来源于stack exchange

