我目前正在使用自定義URI方案來驗證使用OAuth的用戶。爲了做到這一點,我需要從查詢字符串中獲取某些參數的值。有沒有一種簡單的方法從Windows Phone中的URI獲取查詢字符串參數?
有沒有簡單的方法來獲取這些信息?或者是我使用REGEX或其他字符串操作的唯一選擇?
我以前發現了像ParseQueryString這樣的東西的引用,但這些包含在Windows Phone上不可用的庫中。
我目前正在使用自定義URI方案來驗證使用OAuth的用戶。爲了做到這一點,我需要從查詢字符串中獲取某些參數的值。有沒有一種簡單的方法從Windows Phone中的URI獲取查詢字符串參數?
有沒有簡單的方法來獲取這些信息?或者是我使用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;
}
在Windows Phone的XNA遊戲,訪問啓動參數像這樣從你的遊戲類構造函數:
foreach (var lp in this.LaunchParameters) {
Debug.WriteLine(" Key={0}, Value={1}", lp.Key, lp.Value);
}
在Silverlight/XAML應用程序,你可以使用e.InitParams從Application_Startup(對象發件人,StartupEventArgsē )事件處理程序。如何做到這一點的一個例子是在這裏:
從https://stackoverflow.com/a/25164964/1033581:
Uri.UnescapeDataString
Dictionary
而不是IEnumerable
因此可以很容易找到所需的參數對於Windows Phone 7的設備(或者你只有一個字符串,而不是一個開放的,那麼就用你的字符串替換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設備上,Uri.Query
是不可靠對於Uri,如「mailto:[email protected]?subject = subject & body = body」。這就是我們使用Uri.OriginalString
的原因。
對於Windows Phone 8的設備,你有一個開放的,可以優化這種方式,
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);
http://stackoverflow.com/questions/10936266/how-to-break-apart-a-uri-in-wp7 – 2013-04-08 22:14:57