Подтвердить что ты не робот

Как удалить номер порта из строки URL

У меня есть следующий фрагмент кода:

string tmp = String.Format("<SCRIPT FOR='window' EVENT='onload' LANGUAGE='JavaScript'>javascript:window.open('{0}');</SCRIPT>", url);

ClientScript.RegisterClientScriptBlock(this.GetType(), "NewWindow", tmp);

URL, сгенерированный этим кодом, включает номер порта, и я думаю, что это происходит, потому что порт 80 используется веб-сайтом, и в этом коде я пытаюсь загрузить страницу из виртуального каталога веб-сайта. Любые идеи о том, как подавить номер порта в строке URL, сгенерированной этим кодом?

4b9b3361

Ответ 1

Используйте метод Uri.GetComponents. Чтобы удалить компонент порта, вам нужно будет объединить все остальные компоненты, например:

var uri = new Uri( "http://www.example.com:80/dir/?query=test" );
var clean = uri.GetComponents( UriComponents.Scheme | 
                               UriComponents.Host | 
                               UriComponents.PathAndQuery, 
                               UriFormat.UriEscaped );

EDIT: я нашел лучший способ:

var clean = uri.GetComponents( UriComponents.AbsoluteUri & ~UriComponents.Port,
                               UriFormat.UriEscaped );

UriComponents.AbsoluteUri сохраняет все компоненты, поэтому & ~UriComponents.Port будет исключать только порт.

Ответ 2

UriBuilder u1 = new UriBuilder( "http://www.example.com:80/dir/?query=test" );
u1.Port = -1;
string clean = u1.Uri.ToString();

Настройка свойства Port на -1 на UriBuilder приведет к удалению любого явного порта и неявно использует значение порта по умолчанию для схемы протокола.

Ответ 3

Более общее решение (работает с http, https, ftp...) на основе идеи Иана Флинна. Этот метод не удаляет пользовательский порт, если таковой имеется. Пользовательский порт определяется автоматически в зависимости от протокола.

var uriBuilder = new UriBuilder("http://www.google.fr/");
if (uriBuilder.Uri.IsDefaultPort)
{
    uriBuilder.Port = -1;
}
return uriBuilder.Uri.AbsoluteUri;

Ответ 4

Я использовал бы System.Uri. Я не пробовал, но кажется, что ToString действительно выведет то, что вы хотите:

var url = new Uri("http://google.com:80/asd?qwe=asdff");
var cleanUrl = url.ToString();

Если нет, вы можете объединить компоненты url -members для создания строки cleanUrl.

Ответ 5

var url = "http://google.com:80/asd?qwe=zxc#asd";
var regex = new Regex(@":\d+");
var cleanUrl = regex.Replace(url, "");

решение с System.Uri также возможно, но будет более раздутым.

Ответ 6

Вы также можете использовать свойства URIBuilder для этого он имеет свойства для вывода URL-адреса, как вы хотите

Ответ 7

Хорошо, спасибо, я понял это... использовал принцип KISS...

string redirectstr = String.Format(
   "http://localhost/Gradebook/AcademicHonestyGrid.aspx?StudentID={0}&ClassSectionId={1}&uid={2}", 
   studid, 
   intSectionID, 
   HttpUtility.UrlEncode(encrypter.Encrypt(uinfo.ToXml())));

Response.Redirect(redirectstr );

отлично работает для того, что я делаю, что является тестовым жгутом