我目前正在使用自定义 URI 方案来验证使用 OAuth 的用户。为此,我需要从查询字符串中获取某些参数的值。
有没有一种简单的方法来获取这些信息?还是我使用 REGEX 或其他字符串操作的唯一选择?
我以前找到了对 ParseQueryString 之类的引用,但这些引用包含在 Windows Phone 上不可用的库中。
我目前正在使用自定义 URI 方案来验证使用 OAuth 的用户。为此,我需要从查询字符串中获取某些参数的值。
有没有一种简单的方法来获取这些信息?还是我使用 REGEX 或其他字符串操作的唯一选择?
我以前找到了对 ParseQueryString 之类的引用,但这些引用包含在 Windows Phone 上不可用的库中。
经过大量搜索,我找到了一种简单的方法。只要查询字符串保持相当简单(就像它们在 OAuth 中一样),这种方法就可以工作。
public static Dictionary<string, string> ParseQueryString( string uri ) {
string substring = uri.Substring( ( ( uri.LastIndexOf('?') == -1 ) ? 0 : uri.LastIndexOf('?') + 1 ) );
string[] pairs = substring.Split( '&' );
Dictionary<string,string> output = new Dictionary<string,string>();
foreach( string piece in pairs ){
string[] pair = piece.Split( '=' );
output.Add( pair[0], pair[1] );
}
return output;
}
来自https://stackoverflow.com/a/25164964/1033581:
Uri.UnescapeDataString
Dictionary
而不是 aIEnumerable
这样可以轻松找到所需的参数对于 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<string, string> 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<string, string>();
}
注意:在 Windows Phone 7 设备上,对于像“mailto:a@example.com?subject=subject&body=body”这样的 UriUri.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<string, string> 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<string, string>();
}
如果您想知道您是否在使用 Windows Phone 7 应用程序的 Windows Phone 8 设备上:
public static readonly bool IsVersion8 = Environment.OSVersion.Version >= new Version(8, 0);
在 Windows Phone XNA 游戏中,从您的 Game 类 ctor 中访问类似这样的启动参数:
foreach (var lp in this.LaunchParameters) {
Debug.WriteLine(" Key={0}, Value={1}", lp.Key, lp.Value);
}
在 Silverlight/XAML 应用程序中,您将使用来自 Application_Startup(object sender, StartupEventArgs e) 事件处理程序的 e.InitParams。如何做到这一点的一个例子在这里: