5

我目前正在使用自定义 URI 方案来验证使用 OAuth 的用户。为此,我需要从查询字符串中获取某些参数的值。

有没有一种简单的方法来获取这些信息?还是我使用 REGEX 或其他字符串操作的唯一选择?

我以前找到了对 ParseQueryString 之类的引用,但这些引用包含在 Windows Phone 上不可用的库中。

4

3 回答 3

9

经过大量搜索,我找到了一种简单的方法。只要查询字符串保持相当简单(就像它们在 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;

}
于 2013-04-13T06:32:10.630 回答
4

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

  • 在 Uri 中处理#
  • 处理Uri 中可能的缺失值,例如&name=
  • 不要忘记Uri.UnescapeDataString
  • 返回 aDictionary而不是 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);
于 2014-08-06T18:51:11.930 回答
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。如何做到这一点的一个例子在这里:

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

于 2013-04-11T16:50:04.440 回答