在写程序的时候,我们经常需要对页面进行传参数,比如page?id=1234,那么在page这个页面中就直接可以使用string id = Request.QueryString["id"]; 来获取参数id的值1234了。这是一个人人都知道的基础知识。

上面的方法:Request.QueryString,它会把传入的URL进行分析,并把结果保存在一个键值(key value)的Collection中,我们只要通过设置key值,就可以返回这个key所对应的value了。

假设这个URL不是通过请求进来的,我们是没有办法通过Request来获取URL的参数值的,我们是否可以通过一个字符串string url = "http://www.google.com/page?id=1234"中分析出Collection[key]=value呢?而且很多时候我们的URL的参数都是经过UrlEncode编码的,这个编码通常来说会是Encoding.UTF8或者Encoding.GetEncoding("gb2312"),需要提醒你的是:Baidu的URL是使用gb2312的,而Google是使用UTF8的。那对于传入的字符串我们如何确认是该使用gb2312还是UTF8来解码呢?

在Baidu或者Google搜索到相关的解决办法中,你会看到这样的说法,那就是通过正则表达式去匹配URL,例如:Regex urlRegex = new Regex(@"(?:^|\?|&)courseid=(\d*)(?:&|$)"); 但是我比较怀疑通过这个方法分析出来的数据完整性,它有办法确保匹配出所有数据吗?后来我想到了模拟Microsoft .NET Framework中Request的方法来解决这个问题。其实上面的string id = Request.QueryString["id"]; 也可以写成 System.Collections.Specialized.NameValueCollection col = Request.QueryString; string strID = col[”id”];所以让我们来构造这个NameValueCollection吧!

private string ResultDataSign(string postData)

{

//string echostr = Var.SYS_OAUTH_VERIFY_CODE;

NameValueCollection nameValue = GetQueryString(postData);

StringBuilder builder = new StringBuilder();

if (nameValue != null)

{

int count = 0;

String[] sortedKeys = nameValue.AllKeys;

Array.Sort(sortedKeys);

foreach (String key in sortedKeys)

{

count++;

builder.Append(key + "=" + nameValue[key]);

if (count != nameValue.Count)

{

builder.Append("&");

}

}

}

return md5(builder.ToString()).ToLower();

}

private string md5(String input)

{

MD5CryptoServiceProvider Md5 = new MD5CryptoServiceProvider();

return BitConverter.ToString(Md5.ComputeHash(Encoding.UTF8.GetBytes(input))).Replace("-", "");

}

public static NameValueCollection GetQueryString(string queryString)

{

return GetQueryString(queryString, null, true);

}

/// <summary>

/// 将查询字符串解析转换为名值集合.

/// </summary>

/// <param name="queryString"></param>

/// <param name="encoding"></param>

/// <param name="isEncoded"></param>

/// <returns></returns>

public static NameValueCollection GetQueryString(string queryString, Encoding encoding, bool isEncoded)

{

queryString = queryString.Replace("?", "");

NameValueCollection result = new NameValueCollection(StringComparer.OrdinalIgnoreCase);

if (!string.IsNullOrEmpty(queryString))

{

int count = queryString.Length;

for (int i = 0; i < count; i++)

{

int startIndex = i;

int index = -1;

while (i < count)

{

char item = queryString[i];

if (item == '=')

{

if (index < 0)

{

index = i;

}

}

else if (item == '&')

{

break;

}

i++;

}

string key = null;

string value = null;

if (index >= 0)

{

key = queryString.Substring(startIndex, index - startIndex);

value = queryString.Substring(index + 1, (i - index) - 1);

}

else

{

key = queryString.Substring(startIndex, i - startIndex);

}

if (isEncoded)

{

result[MyUrlDeCode(key, encoding)] = MyUrlDeCode(value, encoding);

}

else

{

result[key] = value;

}

if ((i == (count - 1)) && (queryString[i] == '&'))

{

result[key] = string.Empty;

}

}

}

return result;

}

/// <summary>

/// 解码URL.

/// </summary>

/// <param name="encoding">null为自动选择编码</param>

/// <param name="str"></param>

/// <returns></returns>

public static string MyUrlDeCode(string str, Encoding encoding)

{

if (encoding == null)

{

Encoding utf8 = Encoding.UTF8;                 //首先用utf-8进行解码

string code = HttpUtility.UrlDecode(str.ToUpper(), utf8);                 //将已经解码的字符再次进行编码.

string encode = HttpUtility.UrlEncode(code, utf8).ToUpper();

if (str == encode)

encoding = Encoding.UTF8;

else

encoding = Encoding.GetEncoding("gb2312");

}

return HttpUtility.UrlDecode(str, encoding);

}

用到System.web的命名空间

C#获取URL参数值(NameValueCollection)的更多相关文章

  1. C#获取URL参数值

    原文:C#获取URL参数值 在写程序的时候,我们经常需要对页面进行传参数,比如page?id=1234,那么在page这个页面中就直接可以使用string id = Request.QueryStri ...

  2. js获取url参数值(HTML之间传值)

    <h3>未设置设备: <a href="javascript:addTab('设备列表','PKE_DeviceContent/PKE_DeviceContent.aspx ...

  3. 替换所有字符串,获取url参数值

    替换所有的字符串: var newStr = str.replace(/null/g, ""); 获取url参数值 <script type="text/javas ...

  4. js获取url参数值的两种方式

    js获取url参数值的方法有很多,下面也为大家介绍两种.  方法一:正则分析法  function getQueryString(name) {  var reg = new RegExp(" ...

  5. js获取url参数值的几种方式

    一.原生js获取URL参数值: 比如当前URL为:http://localhost:8080/#/page2?id=100&name=guanxy <template> <d ...

  6. C# 解析获取Url参数值

    今天遇到一个需求,需要处理通过接口传过来的一个参数,参数内容为一个拼接好的Url地址,且该地址还会携带了一些额外的参数,包括但不限于数字,字符串,json串.样例如下: http://www.cple ...

  7. js获取url参数值,js获取其他页面传递而来的值

    index.htm?参数1=数值1&参数2=数值2&参数3=数据3&参数4=数值4&...... 静态html文件js读取url参数 根据获取html的参数值控制htm ...

  8. js获取url参数值的方法

    index.htm?参数1=数值1&参数2=数值2&参数3=数据3&参数4=数值4&...... 静态html文件js读取url参数 根据获取html的参数值控制htm ...

  9. 获取url参数值(可解码中文值)

    /** * 根据指定参数名称获取参数值 * @param {String} urlStr 参数名称 * @return {Object} 参数值 * */ getUrlParams = functio ...

随机推荐

  1. AudioManager详解(结合源代码)

    AudioManager:用来对音量大小,声音模式(静音,震动,震动加声音等模式)的管理, 还有用它来注册“插入耳机”时的广播接收者(Action: android.intent.action.MED ...

  2. CentOS6.5下使用NetHogs监控进程网络使用情况

    Nethogs 是一个终端下的网络流量监控工具,它的特别之处在于能够显示每一个进程的带宽占用情况,这样能够更直观获取网络使用情况.它支持 IPv4 和 IPv6 协议.支持本地网卡及 PPP 链接. ...

  3. MVC4中 jquery validate 不用submit方式验证表单或单个元素

    正确引入MVC4 jquery验证的相关文件 <script src="/Scripts/jquery-1.4.4.js"></script> <sc ...

  4. 用JSmooth制作java jar文件的可运行exe文件教程【图文】

    这是我之前在个人博客3yj上面写的一篇文章,如今转载过来,原文地址 (这不是广告哦) 几年前,刚接触java的是,就想用一些方法把自己的劳动果实保护起来,曾经也用过非常多这种工具,有一个特别好用,今天 ...

  5. java中String的用法

    String的用法很活跃,也用到的很多.可以根据自己的需要查询API.这里只有concat和substring,indexof的用法 class TestString { public static ...

  6. 影响布局的inline-block的空白符的问题

    昨天切页面时,进行布局时,想改变以下方法换换口味,所以就抛弃了float方法,采用了display:inline-block方法,没想到却随之而来的带来了一个想不通的问题,那就是空白.废话不多说,上代 ...

  7. AsyncResult

    private static long CalculateFolderSize(string FolderName){ return FolderName.Length;} public delega ...

  8. c语言字符串比较函数strcmp

    strcmp(s1,s2) 说明: 当s1<s2时,返回值<0 当s1=s2时,返回值=0 当s1>s2时,返回值>0两个字符串自左向右逐个字符相比(按ASCII值大小相比较) ...

  9. java中关于String 类型数据 的存储方式

    Constant Pool常量池的概念: 在讲到String的一些特殊情况时,总会提到String Pool或者Constant Pool,但是我想很多人都不太 明白Constant Pool到底是个 ...

  10. CentOS Apache服务器安装与配置

    原文地址:http://www.linuxidc.com/Linux/2014-01/95256.htm 一.安装Apache程序,一般有三种安装方式: Apache在centos下httpd1.直接 ...