Pertanyaan Path.Combine untuk URL?


Path.Combine berguna, tetapi apakah ada fungsi yang serupa dalam kerangka. NET untuk URL?

Saya mencari sintaks seperti ini:

Url.Combine("http://MyUrl.com/", "/Images/Image.jpg")

yang akan kembali:

"http://MyUrl.com/Images/Image.jpg"


1022
2017-12-16 21:42


asal


Jawaban:


Uri memiliki konstruktor yang harus melakukan ini untuk Anda: new Uri(Uri baseUri, string relativeUri)

Inilah contohnya:

Uri baseUri = new Uri("http://www.contoso.com");
Uri myUri = new Uri(baseUri, "catalog/shownew.htm");

1004
2017-10-06 19:37



Kau gunakan Uri.TryCreate( ... ) :

Uri result = null;

if (Uri.TryCreate(new Uri("http://msdn.microsoft.com/en-us/library/"), "/en-us/library/system.uri.trycreate.aspx", out result))
{
    Console.WriteLine(result);
}

Akan kembali:

http://msdn.microsoft.com/en-us/library/system.uri.trycreate.aspx


130
2017-12-16 21:49



Ini mungkin solusi yang sangat sederhana:

public static string Combine(string uri1, string uri2)
{
    uri1 = uri1.TrimEnd('/');
    uri2 = uri2.TrimStart('/');
    return string.Format("{0}/{1}", uri1, uri2);
}

124
2017-09-25 10:29



Sudah ada beberapa jawaban yang bagus di sini. Berdasarkan saran mdsharpe, berikut ini adalah metode ekstensi yang dapat dengan mudah digunakan saat Anda ingin menangani instance Uri:

using System;
using System.Linq;

public static class UriExtensions
{
    public static Uri Append(this Uri uri, params string[] paths)
    {
        return new Uri(paths.Aggregate(uri.AbsoluteUri, (current, path) => string.Format("{0}/{1}", current.TrimEnd('/'), path.TrimStart('/'))));
    }
}

Dan contoh penggunaan:

var url = new Uri("http://example.com/subpath/").Append("/part1/", "part2").AbsoluteUri;

Ini akan menghasilkan http://example.com/subpath/part1/part2


106
2017-11-03 10:20



Pertanyaan ini mendapat beberapa jawaban yang sangat bagus!

Jawaban Ryan Cook dekat dengan apa yang saya cari dan mungkin lebih tepat untuk pengembang lain. Namun, ia menambahkan http: // ke awal string dan secara umum memformat sedikit lebih banyak daripada yang saya inginkan.

Juga, untuk kasus penggunaan saya, menyelesaikan jalur relatif tidak penting.

Jawaban mdsharp juga mengandung benih ide yang bagus, meskipun implementasi yang sebenarnya membutuhkan beberapa rincian lebih untuk diselesaikan. Ini adalah upaya untuk menyempurnakannya (dan saya menggunakan ini dalam produksi):

C #

public string UrlCombine(string url1, string url2)
{
    if (url1.Length == 0) {
        return url2;
    }

    if (url2.Length == 0) {
        return url1;
    }

    url1 = url1.TrimEnd('/', '\\');
    url2 = url2.TrimStart('/', '\\');

    return string.Format("{0}/{1}", url1, url2);
}

VB.Net

Public Function UrlCombine(ByVal url1 As String, ByVal url2 As String) As String
    If url1.Length = 0 Then
        Return url2
    End If

    If url2.Length = 0 Then
        Return url1
    End If

    url1 = url1.TrimEnd("/"c, "\"c)
    url2 = url2.TrimStart("/"c, "\"c)

    Return String.Format("{0}/{1}", url1, url2)
End Function

Kode ini melewati tes berikut, yang kebetulan berada di VB:

<TestMethod()> Public Sub UrlCombineTest()
    Dim target As StringHelpers = New StringHelpers()

    Assert.IsTrue(target.UrlCombine("test1", "test2") = "test1/test2")
    Assert.IsTrue(target.UrlCombine("test1/", "test2") = "test1/test2")
    Assert.IsTrue(target.UrlCombine("test1", "/test2") = "test1/test2")
    Assert.IsTrue(target.UrlCombine("test1/", "/test2") = "test1/test2")
    Assert.IsTrue(target.UrlCombine("/test1/", "/test2/") = "/test1/test2/")
    Assert.IsTrue(target.UrlCombine("", "/test2/") = "/test2/")
    Assert.IsTrue(target.UrlCombine("/test1/", "") = "/test1/")
End Sub

77
2018-05-10 21:53



Berdasarkan sampel URL Anda berikan, saya akan berasumsi Anda ingin menggabungkan URL yang relatif terhadap situs Anda.

Berdasarkan asumsi ini saya akan mengusulkan solusi ini sebagai jawaban yang paling tepat untuk pertanyaan Anda yang: "Path.Combine berguna, apakah ada fungsi serupa dalam kerangka untuk URL? "

Karena ada a fungsi serupa dalam kerangka untuk URL yang saya usulkan yang benar adalah: "VirtualPathUtility.Combine" metode. Berikut tautan referensi MSDN: Metode VirtualPastUtility.Combine

Ada satu peringatan: Saya yakin ini hanya berfungsi untuk URL yang relatif terhadap situs Anda (artinya, Anda tidak dapat menggunakannya untuk menghasilkan tautan ke situs web lain. Misalnya, var url = VirtualPathUtility.Combine("www.google.com", "accounts/widgets");).


32
2018-03-28 00:21



Path.Combine tidak bekerja untuk saya karena bisa ada karakter seperti "|" dalam argumen QueryString dan karena itu Url, yang akan menghasilkan ArgumentException.

Saya pertama kali mencoba pendekatan Uri (Uri baseUri, string relativeUri) baru, yang gagal untuk saya karena Uri seperti http://www.mediawiki.org/wiki/Special:SpecialPages:

new Uri(new Uri("http://www.mediawiki.org/wiki/"), "Special:SpecialPages")

akan menghasilkan Special: SpecialPages, karena titik dua setelah Special yang menunjukkan skema.

Jadi saya akhirnya harus mengambil rute mdsharpe / Brian MacKays dan mengembangkannya sedikit lebih jauh untuk bekerja dengan beberapa bagian uri:

public static string CombineUri(params string[] uriParts)
{
    string uri = string.Empty;
    if (uriParts != null && uriParts.Count() > 0)
    {
        char[] trims = new char[] { '\\', '/' };
        uri = (uriParts[0] ?? string.Empty).TrimEnd(trims);
        for (int i = 1; i < uriParts.Count(); i++)
        {
            uri = string.Format("{0}/{1}", uri.TrimEnd(trims), (uriParts[i] ?? string.Empty).TrimStart(trims));
        }
    }
    return uri;
}

Pemakaian: CombineUri("http://www.mediawiki.org/", "wiki", "Special:SpecialPages")


27
2017-07-15 08:17