在写程序的时候,我们经常需要对页面进行传参数,比如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. Head First C#(赛狗日)

    实验背景: 人:Joe.Bob和AI希望参见赛狗赌博.最初,Joe有50元,Bob有75元,AI有45元.每次比赛前,他们都会各自决定是否下注以及所押的赌金.直到比赛前,他们都可以改变赌金,但是一旦比 ...

  2. Single Number(JAVA)

    Given an array of integers, every element appears twice except for one. Find that single one. Note: ...

  3. 消除多余的row

    tableviewName.tableFooterView = [[UIView alloc]initWithFrame:CGRectZero];

  4. CodeForces 222D - Olympiad

    第一行给出两个个数字k和n,第二三行分别有k个数字,求将第二.三行之间的数字相互组合,求最多有多少个组合的和不小于n 纯粹暴力 #include <iostream> #include & ...

  5. uva 123 Searching Quickly

     Searching Quickly  Background Searching and sorting are part of the theory and practice of computer ...

  6. Dubbo使用详解及环境搭建

    一:Dubbo简介 Dubbo是阿里巴巴提供的开源的SOA(面向服务的体系结构)服务化治理的技术框架,据说只是一部分开源的,但一些基本的需求已经可以满足的,而且可扩展性.是一种能取代PHRPC的服务调 ...

  7. Android studio Debug效率提升

    Android studio Debug效率提升,可以在控制台打印log的同时而不暂停程序的运行,尤其是当遇到复杂交互的时候,比如滑动,拖动,这时候程序暂停执行是特别恶心的.其实你可以更新打印信息而不 ...

  8. CentOS minimal版安装图形界面的步骤(自动获取IP)

    1.连接网络: CentOS minimal.iso安装好后,进入终端,默认是不开网络的, 首先启用网卡, 自动获取ip. ifconfig eth0 up   www.2cto.com  dhcli ...

  9. chapter 1 Number/Adventurous Person

    part1: 1- Which would be easier to remember a munber or a name? Well, I am better at remembering num ...

  10. 项目 Web 的 NuGet 程序包还原失败: 找不到“1.0.0”版本的程序包“Microsoft.Net.Compilers”。。 0

    项目   Web 的 NuGet 程序包还原失败: 找不到“1.0.0”版本的程序包“Microsoft.Net.Compilers”.. 0 使用vs的NutGet包管理器时,另一台电脑从svn下载 ...