[.net] .NET에서 쿼리 문자열을 NameValueCollection으로 구문 분석하는 방법

나는 같은 문자열을 구문 분석하고 싶습니다 p1=6&p2=7&p3=8NameValueCollection.

Page.Request객체에 액세스 할 수 없을 때 가장 우아한 방법은 무엇입니까 ?



답변

이를위한 내장 .NET 유틸리티가 있습니다 : HttpUtility.ParseQueryString

// C#
NameValueCollection qscoll = HttpUtility.ParseQueryString(querystring);
' VB.NET
Dim qscoll As NameValueCollection = HttpUtility.ParseQueryString(querystring)

다음을 교체해야 할 수 있습니다 querystringnew Uri(fullUrl).Query.


답변

HttpUtility.ParseQueryString은 웹 응용 프로그램에 있거나 System.Web에 대한 종속성을 포함하지 않는 한 작동합니다. 이를 수행하는 다른 방법은 다음과 같습니다.

NameValueCollection queryParameters = new NameValueCollection();
string[] querySegments = queryString.Split('&');
foreach(string segment in querySegments)
{
   string[] parts = segment.Split('=');
   if (parts.Length > 0)
   {
      string key = parts[0].Trim(new char[] { '?', ' ' });
      string val = parts[1].Trim();

      queryParameters.Add(key, val);
   }
}


답변

많은 답변이 System.Web 에 대한 승인 된 답변의 종속성으로 인해 사용자 정의 예제를 제공 합니다. 로부터 Microsoft.AspNet.WebApi.Client NuGet 패키지로가 UriExtensions.ParseQueryString 도 사용할 수 있습니다, 방법은 :

var uri = new Uri("https://stackoverflow.com/a/22167748?p1=6&p2=7&p3=8");
NameValueCollection query = uri.ParseQueryString();

따라서 System.Web 종속성 을 피하고 직접 롤링하지 않으려는 경우 좋은 옵션입니다.


답변

전제 조건을 “클라이언트 전용 프레임 워크 하위 집합”으로 제한하면서 ClickOnce 배포의 쿼리 문자열을 구문 분석 할 수 있도록 System.Web에 대한 종속성을 제거하려고했습니다.

나는 rp의 대답을 좋아했다. 논리를 추가했습니다.

public static NameValueCollection ParseQueryString(string s)
    {
        NameValueCollection nvc = new NameValueCollection();

        // remove anything other than query string from url
        if(s.Contains("?"))
        {
            s = s.Substring(s.IndexOf('?') + 1);
        }

        foreach (string vp in Regex.Split(s, "&"))
        {
            string[] singlePair = Regex.Split(vp, "=");
            if (singlePair.Length == 2)
            {
                nvc.Add(singlePair[0], singlePair[1]);
            }
            else
            {
                // only one key with no value specified in query string
                nvc.Add(singlePair[0], string.Empty);
            }
        }

        return nvc;
    }


답변

OLSC 쿼리로 작업 할 때 이미 제공된 것보다 조금 더 다양한 기능이 필요했습니다.

  • 값은 여러 등호를 포함 할 수 있습니다
  • 이름과 값 모두로 인코딩 된 문자 디코딩
  • 클라이언트 프레임 워크에서 실행할 수 있음
  • 모바일 프레임 워크에서 실행할 수 있습니다.

내 해결책은 다음과 같습니다.

Public Shared Function ParseQueryString(ByVal uri As Uri) As System.Collections.Specialized.NameValueCollection
    Dim result = New System.Collections.Specialized.NameValueCollection(4)
    Dim query = uri.Query
    If Not String.IsNullOrEmpty(query) Then
        Dim pairs = query.Substring(1).Split("&"c)
        For Each pair In pairs
            Dim parts = pair.Split({"="c}, 2)

            Dim name = System.Uri.UnescapeDataString(parts(0))
            Dim value = If(parts.Length = 1, String.Empty,
                System.Uri.UnescapeDataString(parts(1)))

            result.Add(name, value)
        Next
    End If
    Return result
End Function

<Extension()>Uri 자체에 기능을 추가하기 위해 그 문제 를 다루는 것은 나쁜 생각이 아닙니다 .


답변

System.Web직접 작성하지 않고 추가 NuGet 패키지없이이 작업 을 수행하려면 다음을 수행 하십시오.

  1. 에 참조 추가 System.Net.Http.Formatting
  2. 더하다 using System.Net.Http;
  3. 이 코드를 사용하십시오 :

    new Uri(uri).ParseQueryString()

https://msdn.microsoft.com/en-us/library/system.net.http.uriextensions(v=vs.118).aspx


답변

HttpUtility.ParseQueryString 을 사용해야하는 System.Web에 대한 종속성을 피하려면에서 찾은 Uri확장 메소드를 사용할 수 있습니다.ParseQueryStringSystem.Net.Http .

아직 참조를 추가하지 않은 경우 참조를 추가하십시오 System.Net.Http프로젝트에 .

참고 유효한에 응답 본문을 변환 할 필요가 있다는 Uri정도로 ParseQueryString(에이 System.Net.Http) 작동합니다.

string body = "value1=randomvalue1&value2=randomValue2";

// "http://localhost/query?" is added to the string "body" in order to create a valid Uri.
string urlBody = "http://localhost/query?" + body;
NameValueCollection coll = new Uri(urlBody).ParseQueryString();