前言:
项目中使用Httprequest请求进行上传文件,测试过程中发现文件名中包括#、&、[]等特殊字符时会请求失败。
问题原因:
参数中的特殊字符被识别成代码;
项目环境:
VisualStudio2015、windows8.1
解决办法:
string name = System.Web.HttpUtility.UrlEncode(Name, System.Text.Encoding.UTF8);
//Name为需要转码的参数,后面可修改为转码的格式,根据情况修改
如何进行编/解码
编码时可以指定编码的,如
System.Web.HttpUtility.UrlEncode(str,System.Text.Encoding.Unicode);
System.Web.HttpUtility.UrlEncode(str,System.Text.Encoding.UTF8);
System.Web.HttpUtility.UrlEncode(str,System.Text.Encoding.GetEncoding( "GB2312 "));
解码也可以指定编码的
System.Web.HttpUtility.UrlDecode(str,System.Text.Encoding.Unicode);
System.Web.HttpUtility.UrlDecode(str,System.Text.Encoding.UTF8);
System.Web.HttpUtility.UrlDecode(str,System.Text.Encoding.GetEncoding( "GB2312 "));
另分享一个Httprequest工具类(没有完全测试过,勿喷)
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
using System.Net;
using System.Net.Security;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Web;
namespace tools
{
/// <summary>
/// 网络工具类。
/// </summary>
public sealed class WebUtils
{
private int _timeout = 20000;
private int _readWriteTimeout = 60000;
private bool _ignoreSSLCheck = true;
private bool _disableWebProxy = false;
/// <summary>
/// 等待请求开始返回的超时时间
/// </summary>
public int Timeout
{
get { return this._timeout; }
set { this._timeout = value; }
}
/// <summary>
/// 等待读取数据完成的超时时间
/// </summary>
public int ReadWriteTimeout
{
get { return this._readWriteTimeout; }
set { this._readWriteTimeout = value; }
}
/// <summary>
/// 是否忽略SSL检查
/// </summary>
public bool IgnoreSSLCheck
{
get { return this._ignoreSSLCheck; }
set { this._ignoreSSLCheck = value; }
}
/// <summary>
/// 是否禁用本地代理
/// </summary>
public bool DisableWebProxy
{
get { return this._disableWebProxy; }
set { this._disableWebProxy = value; }
}
/// <summary>
/// 执行HTTP POST请求。
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="textParams">请求文本参数</param>
/// <returns>HTTP响应</returns>
public string DoPost(string url, IDictionary<string, string> textParams)
{
return DoPost(url, textParams, null);
}
/// <summary>
/// 执行HTTP POST请求。
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="textParams">请求文本参数</param>
/// <param name="headerParams">请求头部参数</param>
/// <returns>HTTP响应</returns>
public string DoPost(string url, IDictionary<string, string> textParams, IDictionary<string, string> headerParams)
{
HttpWebRequest req = GetWebRequest(url, "POST", headerParams);
req.ContentType = "application/x-www-form-urlencoded;charset=utf-8";
byte[] postData = Encoding.UTF8.GetBytes(BuildQuery(textParams));
System.IO.Stream reqStream = req.GetRequestStream();
reqStream.Write(postData, 0, postData.Length);
reqStream.Close();
HttpWebResponse rsp = (HttpWebResponse)req.GetResponse();
Encoding encoding = GetResponseEncoding(rsp);
return GetResponseAsString(rsp, encoding);
}
/// <summary>
/// 执行HTTP GET请求。
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="textParams">请求文本参数</param>
/// <returns>HTTP响应</returns>
public string DoGet(string url, IDictionary<string, string> textParams)
{
return DoGet(url, textParams, null);
}
/// <summary>
/// 执行HTTP GET请求。
/// </summary>
/// <param name="url">请求地址</param>
/// <param name="textParams">请求文本参数</param>
/// <param name="headerParams">请求头部参数</param>
/// <returns>HTTP响应</returns>
public string DoGet(string url, IDictionary<string, string> textParams, IDictionary<st