有没有一种简单的方法从Windows Phone中的URI获取查询字符串参数?
我目前正在使用自定义URI方案来validation使用OAuth的用户。 为此,我需要从查询字符串中获取某些参数的值。
有没有一种简单的方法来获取这些信息? 或者是我唯一选择使用REGEX或其他字符串操作?
我以前发现了对ParseQueryString之类的引用,但这些引用包含在Windows Phone上不可用的库中。
经过大量的搜索后,我采用了一种简单的方法。 只要查询字符串保持相当简单(因为它们在OAuth中),此方法就可以工作。
public static Dictionary ParseQueryString( string uri ) { string substring = uri.Substring( ( ( uri.LastIndexOf('?') == -1 ) ? 0 : uri.LastIndexOf('?') + 1 ) ); string[] pairs = substring.Split( '&' ); Dictionary output = new Dictionary(); foreach( string piece in pairs ){ string[] pair = piece.Split( '=' ); output.Add( pair[0], pair[1] ); } return output; }
来自https://stackoverflow.com/a/25164964/1033581 :
- 处理Uri中的#
- 在Uri中处理像&name =这样的可能缺失值
- 不要忘记
Uri.UnescapeDataString
- 返回
Dictionary
而不是IEnumerable
这样可以轻松找到所需的参数
对于Windows Phone 7设备(或者您只有一个字符串,而不是Uri,那么只需用您的字符串替换uri.OriginalString
),
static readonly char[] QueryStringSeparator1 = "#".ToCharArray(); static readonly char[] QueryStringSeparator2 = "?".ToCharArray(); static readonly char[] QueryStringSeparator3 = "&".ToCharArray(); static readonly char[] QueryStringSeparator4 = "=".ToCharArray(); public static Dictionary QueryDictionary(this Uri uri) { return uri.OriginalString .Split(QueryStringSeparator1, StringSplitOptions.RemoveEmptyEntries) .Select(a => a.Split(QueryStringSeparator2, StringSplitOptions.RemoveEmptyEntries) .Select(b => b.Split(QueryStringSeparator3, StringSplitOptions.RemoveEmptyEntries) .Select(c => c.Split(QueryStringSeparator4)) .Where(c => c[0].Length > 0) .ToDictionary(c => Uri.UnescapeDataString(c[0]), c => c.Length > 1 ? Uri.UnescapeDataString(c[1]) : "")) .ElementAtOrDefault(1))// after ? .FirstOrDefault()// before # ?? new Dictionary(); }
注意:在Windows Phone 7设备上,对于像“mailto:a@example.com?subject = subject&body = body”这样的Uri, Uri.Query
是不可靠的。 这就是我们使用Uri.OriginalString
的原因。
对于Windows Phone 8设备而且你有一个Uri,你可以这样优化,
static readonly char[] QueryStringSeparator1 = "#".ToCharArray(); static readonly char[] QueryStringSeparator3 = "&".ToCharArray(); static readonly char[] QueryStringSeparator4 = "=".ToCharArray(); public static Dictionary QueryDictionary(this Uri uri) { return uri.Query .Split(QueryStringSeparator1, StringSplitOptions.RemoveEmptyEntries) .Select(a => a.Substring(1) .Split(QueryStringSeparator3, StringSplitOptions.RemoveEmptyEntries) .Select(c => c.Split(QueryStringSeparator4)) .Where(c => c[0].Length > 0) .ToDictionary(c => Uri.UnescapeDataString(c[0]), c => c.Length > 1 ? Uri.UnescapeDataString(c[1]) : "")) .FirstOrDefault()// before # ?? new Dictionary(); }
如果您想知道自己是否使用Windows Phone 7应用程序使用Windows Phone 8设备:
public static readonly bool IsVersion8 = Environment.OSVersion.Version >= new Version(8, 0);
在Windows Phone XNA游戏中,从Game class ctor访问这样的启动参数:
foreach (var lp in this.LaunchParameters) { Debug.WriteLine(" Key={0}, Value={1}", lp.Key, lp.Value); }
在Silverlight / XAML应用程序中,您将使用Application_Startup(对象发送方,StartupEventArgs e)事件处理程序中的e.InitParams。 这方面的一个例子如下:
- entity framework无法处理简单的表变量?
- 处理和转换中哪一个更快int.Parse(),int.TryParse(),Convert.Int32()
- ITextShape可点击的多边形或路径
- 80040154 Outlook 2010中未注册ERROR的类添加
- 如何使用Roslyn编译C#解决方案?
- 服务应用程序的Google oAuth 2.0(JWT令牌请求)
- 如何在自定义.NET Web控件中指定必需属性?
- 在给定当前URL的情况下,是否有内置的创建绝对(完全限定)url来自相对路径,例如“〜/ page.aspx”?
- reflection(?) – 检查类中每个属性/字段的null或为空?