AspDotNetDev Ответов: 3

Задача: элегантно префикс поддомена к URL-адресу


Ответ может быть на языке C# или VB.NET-да. Вот в чем проблема. Преобразовать http://blog.site.com/path/page.aspx в http://mobile.blog.site.com/path/page.aspx используя самый элегантный из возможных методов. Я могу сделать это сам, но я думаю, что один из вас может придумать что-то более умное, чем я думал до сих пор.

Вот некоторые правила:
  • Избегайте жесткого кодирования строк. "http", "Мобильный", "Блог", "Сайт", "путь" и "страница" могут измениться, поэтому вы не можете использовать их, скажем, с помощью, string.Replace().
  • "site.com" изменится на "mobile.site.com". "myapp.blog.site.com" изменится на "mobile.myapp.blog.site.com".
  • Постарайтесь использовать уже существующие .Чистые классы (например,, System.UriBuilder) вместо того, чтобы изобретать велосипед.
  • Если ваше решение в чем-то лучше, чем другие уже опубликованные решения, опубликуйте и свое тоже!


Это одна из потенциальных отправных точек:
private string PrefixSubdomain(string subdomain)
{
    var builder = new System.UriBuilder(Request.Url.ToString());
    // ...
}

Private Function PrefixSubdomain(subdomain As String) As String
	Dim builder As New System.UriBuilder(Request.Url.ToString())
	' ...
End Function

Вам не нужно использовать UriBuilder! Вместо этого вы можете, например, использовать регулярное выражение (хотя это может быть менее элегантно по моим стандартам).

3 Ответов

Рейтинг:
2

#realJSOP

private string PrefixSubDomain(string subDomain)
{
    // split the string
    string[] parts =  Request.Url.ToString().Split('/');
    // create a StringBuilder to economize overhead - init with 
    // the first element of the split string array
    StringBuilder newPath = new StringBuilder(parts[0]);
    // now process the remaining array elements
    for (int i = 1; i < parts.Length; i++)
    {
        if (i == 2)
        {
            newPath.AppendFormat("/{0}", subDomain);
            if (subDomain.EndsWith("."))
            {
                newPath.Append(parts[i]);
            }
            else
            {
                newPath.AppendFormat(".{0}", parts[i]);
            }
        }
        else
        {
            newPath.AppendFormat("/{0}", (string.IsNullOrEmpty(parts[i]) ? "" : parts[i]));
        }
    }
    return newPath.ToString();
}


Извините за все эти изменения. Я чинил, когда думал о вещах.


AspDotNetDev

Пересмотрите прочь! Хотя, по-моему, я тебя побил. Я собираюсь опубликовать решение, которое я только что придумал. Я проверю и ваш, и мой после того, как отправлю свой.

#realJSOP

Я только что опубликовал свою последнюю правку.

#realJSOP

когда вы добавляете поддомен в "www.blah.com", вы снимаете "www" и заменяете его новым поддоменом?

Учитывая все вращения, которые вы должны выполнить, чтобы сделать это по-другому, вы должны подвергнуть сомнению ценность отказа от использования строки.Заменять. Это пустая победа.

AspDotNetDev

Для моих целей я никогда не буду иметь дело с ... www.site.com-но это может оказаться полезным для кого-то еще. Кроме того, имейте в виду, что "http" может быть "https" и если эта функция не использует "запрос.Url" он также может иметь дело со случаем полного отсутствия "http://". Вот почему мое решение использует UriBuilder... потому что это класс, который имеет дело с этими нюансами автоматически.

#realJSOP

Мое решение не зависит от http/https. Он просто разбивает строки на прямые косые черты, а затем перестраивает url-адрес по частям за раз.

AspDotNetDev

Да, я не это имел в виду. Я просто упомянул об этом, потому что это может вызвать проблемы, если кто-то будет использовать строку.Заменять().

AspDotNetDev

Это, кажется, не работает для меня. Когда я пытаюсь запустить его локально, выводится "localhost". Когда я запускаю его на живом сайте, результат таков: "blog.site.com". Кажется, что он опускает протокол, порт, путь и страницу. Кроме того, я проверил свое решение, и оно, кажется, работает нормально (пришлось внести небольшие изменения).

#realJSOP

Вероятно, это потому, что я использовал Host вместо всего URL-адреса. Я протестировал это в консольном приложении (меня больше беспокоил синтаксический анализ/повторная сборка).

Рейтинг:
15

AspDotNetDev

private string PrefixSubdomain(string subdomain)
{
    var builder = new UriBuilder(Request.Url);
    builder.Host = subdomain + "." + builder.Host;
    return builder.Uri.ToString();
}

Мне не очень нравится, что я использую строковую константу ("."). Кроме того, это самый элегантный код, который я мог придумать.


#realJSOP

Блин. Я единственный, кто ответил?

AspDotNetDev

Ну, ты и я. Думаю, мы были единственными, кто справился с этой задачей.

Рейтинг:
1

shadow1989

var subDomain = "donation";

   var builder = new UriBuilder(Request.Url.AbsoluteUri);
   var host = builder.Host;
   string[] parts = host.Split('.');
   if (parts.Length > 2)
   {
       //there is sub
       parts[0] = subDomain;
   }
   //merge 'em
   host ="";
   for (int i = 0; i < parts.Length; i++)
   {
       host += parts[i];
   }
   builder.Host = host;