2013-04-08 65 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); 
相关问题