一、问题 URL 传递时 客户端发送的和服务端接收到的不一致
经分析是因为URL 中含有特殊字符"#$ ^ & * + =",这些字符在URL 中被转义啦!!!
常见的URL 中的特殊字符、表示的意义以及十六进制的表示
字符 意义 十六进制
+ URL 中+号表示空格 %2B
空格 URL中的空格可以用+号或者编码 %20
/ URL 中分隔目录和子目录 %2F
? URL 中分隔实际的 URL 和参数 %3F
% URL 中指定特殊字符 %25
# URL 中表示书签 %23
& URL 中指定的参数间的分隔符 %26
= URL 中指定参数的值 %3D
二、常见解决方法
在 c#中有三种常用的编码方式,可以有效的解决URL传输中特殊字符的问题
1 HttpUtility.UrlEncode
2 Server.UrlEncode
3 Uri.EscapeUriString
我们以第一个方法为例:
//需要现在工程中引用System·web
var tmpURL = @"C:\Users\hu\Desktop\数据\tiemtest\000000#$^&*+=";
var originalUrl = System.Web.HttpUtility.UrlEncode(tmpURL );
var serverUrl = System.Web.HttpUtility.UrlDecode(originalUrl);
//这一步我们发现serverUrl 和tmpURL 是一致的,这样就达到了我们想要的效果
今天介绍另外一种,在URL 中传递文件路径时发现上述问题,于是采用了上述三种方法之外的方法:
三、所用方法
客户端传递URL:
//先转成UTF8编码
var filePathByte = Encoding.UTF8.GetBytes(filePath);
//再转为Base64
subFilePath = Convert.ToBase64String(filePathByte);
RestProxy.RestPostAsync<bool, Stream>(GetFileMethodUrl("Method", subFilePath), fileContent, callBack, config);
服务端接收处理:
服务端转换过程和客户端的转换过程相反,服务对接收到的URL要先进行URL base 64 转换 再进行UTF8 转换
//base64 转换
subFilePath = Convert.FromBase64String(subFilePath));
//UTF8 转换
subFilePath = subFilePath = Encoding.UTF8.GetString(subFilePath );
//针对"\\"进行特殊处理
while (subFilePath.StartsWith("\\"))
{
subFilePath = subFilePath.Remove(0, 1);
}
上述方法可以解决文件路径当URL的一部分来传递时遇到异常的情况
Copyright © 广州京杭网络科技有限公司 2005-2024 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有