2013-04-08 33 views
5

我目前正在使用自定義URI方案來驗證使用OAuth的用戶。爲了做到這一點,我需要從查詢字符串中獲取某些參數的值。有沒有一種簡單的方法從Windows Phone中的URI獲取查詢字符串參數?

有沒有簡單的方法來獲取這些信息?或者是我使用REGEX或其他字符串操作的唯一選擇?

我以前發現了像ParseQueryString這樣的東西的引用,但這些包含在Windows Phone上不可用的庫中。

+2

http://stackoverflow.com/questions/10936266/how-to-break-apart-a-uri-in-wp7 – 2013-04-08 22:14:57

回答

8

經過大量搜索我的降落在一個簡單的方法。只要查詢字符串保持相當簡單(因爲它們在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; 

} 
0

在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ē )事件處理程序。如何做到這一點的一個例子是在這裏:

http://weblogs.asp.net/lduveau/archive/2009/08/15/provide-startup-parameters-to-silverlight-with-initparams.aspx

4

https://stackoverflow.com/a/25164964/1033581

  • 處理一個在烏里
  • 在烏里
  • 不忘Uri.UnescapeDataString
  • 返回處理像&名=可能遺漏值a 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); 
相關問題