2009-11-25 5 views
5

Мне нужно объединить два URL-адреса, в которых содержатся данные .Path.Часть пути перезаписывается при слиянии двух URI

Я хотел бы использовать Uri, чтобы дать мне возможность .TryCreate(), чтобы я мог уловить неверные URL.

Проблема, с которой я столкнулся в том, что путь базы URI, кажется, игнорируется, когда я сливаю абсолютный и относительный URI:

Uri absoluteUri= new Uri("http://hostname/path/", UriKind.Absolute); 
Uri relativeUri = new Uri("/my subsite/my page.aspx?my=query", UriKind.Relative); 
Uri resultUri; 
if (!Uri.TryCreate(absoluteUri, relativeUri, out resultUri)) 
     // handle errors 

Выход из выше:

http://hostname/my%20subsite/my%20page.aspx?my=query 

Я хотел бы, чтобы это было:

http://hostname/path/my%20subsite/my%20page.aspx?my=query 

есть ли способ объединить URL-адреса, которые BO го содержат информацию о пути, используя класс Uri?

ответ

12

Ваш относительный URI должен быть относительным, т.е. удалить первый слэш (или добавить период),

string relative = "/my subsite/my page.aspx?my=query"; 

Uri test1= new Uri(relative.Substring(1), UriKind.Relative); // without 'root' 
Uri test2= new Uri("." + relative, UriKind.Relative);  // with 'current' 

Рабочий пример:

Uri baseUri = new Uri("http://hostname/path/"); 
string relative = "/my subsite/my page.aspx?my=query"; 

Uri test1 = new Uri(baseUri, relative);    // original string 
Uri test2 = new Uri(baseUri, relative.Substring(1)); // without 'root' character 
Uri test3 = new Uri(baseUri, "." + relative);  // with 'current' character 

Console.WriteLine(test1.OriginalString); // wrong 
Console.WriteLine(test2.OriginalString); // right! 
Console.WriteLine(test3.OriginalString); // right! 

Таким образом, вы, вероятно, должны иметь дело с вашей относительной части например:

if (relative.StartsWith("/")) 
    relative = "." + relative; 
+0

Вы попробовали? не делает никакой разницы когда я делаю. –

+0

@anders, да, работает для меня; Я редактирую свой ответ с полным примером; пожалуйста, посмотрите –

+3

А я нашел, что заставило ваш код работать, а не мой: Кажется, что абсолютный URL-адрес также должен заканчиваться /, чтобы заставить его работать! Я использовал string absoluteUrl = "http: // hostname/path"; и это не сработало, но с обеими концевыми славами после «пути» и без стартовой косой черты перед «моим» это работает! Похоже, это плохой тест, но вы заслуживаете ответа на этот вопрос :-) –

Смежные вопросы