在写程序的时候,我们经常需要对页面进行传参数,比如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. 浅谈ThreadPool 线程池

    本文来自:http://www.cnblogs.com/xugang/archive/2010/04/20/1716042.html 相关概念: 线程池可以看做容纳线程的容器: 一个应用程序最多只能有 ...

  2. OGG常见问题处理

    1403: ORA-01403: No data found 在运行PL/SQL块.存储过程.函数.触发器等,假设须要进行操作的记录没有查询到.则会返回1403的错误 Goldengate中的1403 ...

  3. .NET 基础串讲

    C#基础 .NET介绍 —计算机发展史 第一代语言:机器语言 0101 第二代语言:汇编语言, 用一些简洁的英文字母.符号串来替代一个特定指令的二进制串 第三代语言:接近于数学语言或人的自然语言,同时 ...

  4. IE 中创建 子窗口 传值 与接收值 【window.showModalDialog】

    父窗口 创建一个窗口 var backinfo = window.showModalDialog('UserSelect.aspx', '', 'dialogHeight=600px; dialogW ...

  5. jQuery中$.getJSON的返回值问题

    在使用$.getJSON获得数据库的返回值后,想将该值return传给其他函数.结果遇到问题. $.getJSON(url, data, function(result) { return resul ...

  6. 解析Xml四种方法

    关键字:Java解析xml.解析xml四种方法.DOM.SAX.JDOM.DOM4j.XPath [引言] 目前在Java中用于解析XML的技术很多,主流的有DOM.SAX.JDOM.DOM4j,下文 ...

  7. iOS二进制和资源包的自检

    因为现在做的是企业版的APP,不能保证用户不越狱,也不能保证有些用户喜欢自己修改ipa包里的资源文件,比如更换一些资源图片.因此,我们有必要在请求报文中,增加正版应用的二进制和资源文件的标识,让服务器 ...

  8. WebConfig配置 文件加密处理

    webconfig 文件加密处理   前几日正好遇到配置文件加密解密的问题,简单记录下流程. 1.首先运行cmd然后打开Framework.cd C:\Windows\Microsoft.NET\Fr ...

  9. 使用ICE进程间通信时,IP和端口的选择

    使用ICE进程间通信时,IP和端口的选择 服务器在创建时使用的Endpint格式为 tcp  -h IP地址 -p 端口 1.IP地址的选择 如果填某个网卡的地址,则只在这个地址上监听,客户端必须连这 ...

  10. Apache的httpd命令详解

    Apache的httpd命令详解 来源:全栈开发者 发布时间:2012-01-03 阅读次数:10965 4   httpd.exe为Apache HTTP服务器程序.直接执行程序可启动服务器的服务. ...