在写程序的时候,我们经常需要对页面进行传参数,比如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. java-四个线程修改一个变量

    package 经典; public class 四个线程 { private int j=10; /** * @param args */ public static void main(Strin ...

  2. jQuery UI的基本使用方法与技巧

    一.概述 jQuery UI is a widget and interaction library built on top of the jQuery JavaScript Library, th ...

  3. 关于.netFramework概述

    这几天学了不少东西,想来还是应该总结一下,一来自己回顾一下,二来也怕自己忘记,在文章中,有很多东西就是借鉴别人的blog,笔者在这里对他们的无私奉献表示感谢.笔者的语言组织能力有限,如果在文章中出现什 ...

  4. 【27前端】在线css三角

    我们都知道利用css边框的属性可以画出三角形,这里为了方便,我做了一个简单的demo页面供大家使用. 在线css三角

  5. git push -u origin master 上传出错问题

    ============================================ 跟着廖学锋教程初学git发现个很奇怪的问题,后面原来发现是这样,有点逗.. ================= ...

  6. sql相关操作

    1.两个不同数据库对应字段相应操作 //操作模版:insert into data2.table2(字段1,字段2,字段) select 字段j,字段k,字段m from data1.table1举例 ...

  7. HTML5的结构学习(2) --- 新增的非主体结构元素

    除了上一篇学习到的主体结构元素之外,html5还增加了一些表示逻辑结构和附加信息的非主体结构元素: 1.header 解释:一种具有引导和导航作用的结构元素. 用途:通常用来放置整个页面或者页面内某一 ...

  8. python之函数的使用

    备注:本篇文章主要讲一讲函数及集合的一些常用用法: 一.首先先看下,集合(set): 集合的特点:无序.不重复(这点跟字典有点像) <1>,在需要访问集合的时候,由于集合本身是无序的,所以 ...

  9. 在Azure Cloud Service中部署Java Web App(1)

    Microsoft Azure是一个开放的,灵活的云平台,除了对自家的.Net平台有良好的支持外,对于各种开源的软件,语言,工具,框架都有着良好的支持,比如Java,Php,Python等等,你可以使 ...

  10. Azure上Linux VM DDOS攻击预防: 慢速攻击

    在上篇博客(http://www.cnblogs.com/cloudapps/p/4996046.html)中,介绍了如何使用Apache的模块mod_evasive进行反DDOS攻击的设置,在这种模 ...