Sorgu dizesi olmadan URL'yi alın


189

Ben böyle bir URL var:

http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye

Elde etmek istiyorum http://www.example.com/mypage.aspx .

Nasıl anlayabileceğimi söyleyebilir misin?

Yanıtlar:


129

Kullanabilirsiniz System.Uri

Uri url = new Uri("http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye");
string path = String.Format("{0}{1}{2}{3}", url.Scheme, 
    Uri.SchemeDelimiter, url.Authority, url.AbsolutePath);

Veya kullanabilirsiniz substring

string url = "http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye";
string path = url.Substring(0, url.IndexOf("?"));

EDIT: Brillyfresh'in yorumdaki önerisini yansıtacak şekilde ilk çözümü değiştirmek.


6
url.AbsolutePath, URL'nin yalnızca yol kısmını (/mypage.aspx) döndürür; İstediğiniz tam URL için url.Scheme (http) + Uri.SchemeDelimiter (: //) + url.Tasarım (www.somesite.com)
Ryan

20
Uri.GetLeftPart yöntemi belirtildiği gibi daha basit stackoverflow.com/questions/1188096/…
Edward Wilde

substringHiçbir Sorgu dizesi varsa yöntem hatası verecektir. string path = url.Substring(0, url.IndexOf("?") > 0? url.IndexOf("?") : url.Length);Bunun yerine kullanın .
stomi

378

İşte daha basit bir çözüm:

var uri = new Uri("http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye");
string path = uri.GetLeftPart(UriPartial.Path);

Buradan ödünç alındı: Sorgu Dizesini Kırpma ve Temiz URL C Döndürme C # ASP.net


17
Tek satırlı sürüm:return Request.Url.GetLeftPart(UriPartial.Path);
jp2code

uri.GetComponent(bir Uri'nin parçalarını almak için başka bir harika yöntemdir. Bu ikisini şimdiye kadar bilmiyordum!
AaronLS

38

Bu benim çözümüm:

Request.Url.AbsoluteUri.Replace(Request.Url.Query, String.Empty);

35
Request.RawUrl.Split(new[] {'?'})[0];

2
Bunu tam bir uri olmadan kullanabilmeniz için beğendim.
KingOfHococrites

Unutmayın RawUrlURL'yi alacak önce belki kullanmak, URL yeniden yazar AbsoluteUri? Request.Url.AbsoluteUri.Split('?')[0]
Koruyucu bir


16

Benim yolum:

new UriBuilder(url) { Query = string.Empty }.ToString()

veya

new UriBuilder(url) { Query = string.Empty }.Uri

Bu yöntem olmadığı için NET Core 1.0 projesi için kullandığım budur Uri.GetLeftPart. NET Core (1.1) 'in son sürümü bu yönteme sahip olmalıdır (şu an net çekirdek 1.1'de olmadığım için onaylayamıyorum)
psulek

1
Bunu beğendim çünkü URI oluşturmak tam olarak UriBuilder'ın ne için olduğu. Diğer tüm cevaplar (iyi) kesmek.
Nine Tails

11

Sen kullanabilirsiniz Request.Url.AbsolutePathsayfa adını almak ve Request.Url.Authorityana bilgisayar adı ve port için. Tam olarak ne istediğinizi vermek için yerleşik bir mülk olduğuna inanmıyorum, ancak bunları kendiniz birleştirebilirsiniz.


1
Bana / mypage.aspx veriyor, istediğim gibi değil.
Rocky Singh

4

Split () Varyasyonu

Sadece referans için bu varyasyonu eklemek istiyorum. Url'ler genellikle dizelerdir ve bu nedenle Split()yöntemi kullanmak daha kolaydır Uri.GetLeftPart(). Ve Split()Uri bir istisna atar oysa aynı zamanda akrabası olan boş ve boş değerleri ile çalışmalarına yapılabilir. Buna ek olarak, Url'ler, (pdf'yi /report.pdf#page=10belirli bir sayfada açan) gibi bir karma da içerebilir .

Aşağıdaki yöntem tüm bu URL türleriyle ilgilidir:

   var path = (url ?? "").Split('?', '#')[0];

Örnek Çıktı:


1
Ben kendime kadar herhangi bir upvotes kazanmadı oldukça şok oldum. Bu harika bir çözüm.
jason

3

İşte @ Kolman'ın cevabını kullanan bir uzatma yöntemi. Path () 'i kullanmayı hatırlamak marjinal olarak GetLeftPart'tan daha kolaydır. En azından C # 'a uzantı özellikleri ekleyene kadar Yolu GetPath olarak yeniden adlandırmak isteyebilirsiniz.

Kullanımı:

Uri uri = new Uri("http://www.somewhere.com?param1=foo&param2=bar");
string path = uri.Path();

Sınıf:

using System;

namespace YourProject.Extensions
{
    public static class UriExtensions
    {
        public static string Path(this Uri uri)
        {
            if (uri == null)
            {
                throw new ArgumentNullException("uri");
            }
            return uri.GetLeftPart(UriPartial.Path);
        }
    }
}

1
    string url = "http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye";
    string path = url.split('?')[0];

1

System.Uri.GetComponents, istediğiniz bileşenleri belirtin.

Uri uri = new Uri("http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye");
uri.GetComponents(UriComponents.SchemeAndServer | UriComponents.Path, UriFormat.UriEscaped);

Çıktı:

http://www.example.com/mypage.aspx


0

Silverlight için çözüm:

string path = HtmlPage.Document.DocumentUri.GetComponents(UriComponents.SchemeAndServer, UriFormat.Unescaped);

0

Basit bir uzantı oluşturdum, çünkü diğer cevaplardan birkaçı bir QueryStringbaşlangıç olmasa da boş istisnalar attı :

public static string TrimQueryString(this string source)
{ 
    if (string.IsNullOrEmpty(source))
            return source;

    var hasQueryString = source.IndexOf('?') != -1;

    if (!hasQueryString)
        return source;

    var result = source.Substring(0, source.IndexOf('?'));

    return result;
}

Kullanımı:

var url = Request.Url?.AbsoluteUri.TrimQueryString() 

-1

basit bir örnek aşağıdaki gibi alt dize kullanmak olacaktır:

string your_url = "http://www.example.com/mypage.aspx?myvalue1=hello&myvalue2=goodbye";
string path_you_want = your_url .Substring(0, your_url .IndexOf("?"));

-1
var canonicallink = Request.Url.Scheme + "://" + Request.Url.Authority + Request.Url.AbsolutePath.ToString();


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.