2010-01-27 12 views
6

Poniższy wiersz kodu podaje wyjątek. Czy jest to błąd w strukturze? Jeśli nie, jakie podejście mógłbym zastosować?dlaczego dwukropek ":" w Uri przekazany do Uri.MakeRelativeUri powoduje wyjątek?

Wydaje się być „:” (dwukropek), który powoduje, że w tej kwestii, jednak ja widzę taki URI pracy na stronach produkcyjnych OK (tzn wydaje się być prawidłowy URI w realnym świecie)

Uri relativeUri = new Uri("http://test.com/asdf").MakeRelativeUri(new Uri("http://test.com/xx:yy")); 
// gives => System.UriFormatException: A relative URI cannot be created because the 
// 'uriString' parameter represents an absolute URI 

Uri relativeUri = new Uri("http://test.com/asdf").MakeRelativeUri(new Uri("http://test.com/xxyy")); 
// this works - removed the colon between the xx and yy 

PS. W szczególności mogę zapytać, biorąc pod uwagę powyższe przypadki, do jakiej klasy/metody .NET mogę użyć (zauważając, że parsuję stronę HTML z sieci), aby wziąć (a) identyfikator strony i (b) względny ciąg znaków z kodu HTML Argument HREF [np byłby "/ xx: rr" w tym przypadku] i zwrócił prawidłowy identyfikator URI, który mógłby być użyty do adresowania tego zasobu?

Innymi słowy, w jaki sposób mogę naśladować zachowanie przeglądarki, która tłumaczy HREF i identyfikator URI strony, aby utworzyć identyfikator URI, którego używa, aby przejść do tego zasobu, gdy go klikniesz.

+1

Jon Postel: "bądźcie liberalni w tym, co akceptujecie i zachowawczo w tym, co wyślecie". Proszę podać RFC i jego numer akapitu, które potwierdzają, że jest to poprawny URI. –

Odpowiedz

5

Uważam, że to błąd.

RFC1738 mówi, że : (między innymi znakami) może być zarezerwowany dla specjalnego znaczenia w ramach schematu. Jednak system http nie zarezerwować go w części ścieżki

Within the <path> and <searchpart> components, "/", ";", "?" are reserved. 

(Nie :.)

hsegment  = *[ uchar | ";" | ":" | "@" | "&" | "=" ] 

Więc http://test.com/xx:yy jest prawidłowy URI. Nowsza RFC3968 zgadza:

pchar   = unreserved/pct-encoded/sub-delims/":"/"@" 

Jednak oczywiście zrelatywizować przeciwko http://test.com/asdf, powstałą xx:yy byłby absolutny URI a nie obowiązują w stosunku URI:

path-noscheme = segment-nz-nc *("/" segment) 
segment-nz-nc = 1*(unreserved/pct-encoded/sub-delims/"@") 
       ; non-zero-length segment without any colon ":" 

Więc MakeRelativeUri jest rodzajem prawa do zgłaszania jest problem, ale naprawdę musi on być naprawiony automatycznie, kodując kod :, który jest poprawny w bezwzględnym identyfikatorze URI dla %3A, który jest poprawny w pierwszym segmencie względnego URI.

Generalnie staram się unikać MakeRelativeUri na rzecz względnych URI, które są łatwiejsze do wyodrębnienia i nie mają tego problemu (/xx:yy jest OK).

+0

dziękuję bobince thats great - czy znasz bezpośredni .net metoda, która daje relatywny identyfikator URI z PageURI + HRefString? Po prostu szukasz jednego w tej chwili ... lub czy musisz "zrobić to sam"? – Greg

+0

Właściwie powinienem prawdopodobnie zacząć nowe pytanie i zaznaczyć to jako gotowe ... Zrobię to – Greg

+0

stworzył to konkretne pytanie na http://stackoverflow.com/questions/2144150/c-question-how-do -i-convert-a-pageuri-href-to-an-absolute-url-uri – Greg

1

Colons odgrywają szczególną rolę w adresach URL - w celu oznaczenia portu dla przykładu i są w związku z tym "zastrzeżone" (see here).

Adresy URL wykorzystują niektóre znaki do specjalnego zastosowania przy definiowaniu ich składni za pomocą specjalnych . Kiedy znaki te nie są stosowane w ich szczególnej roli wewnątrz adresu URL, muszą być zakodowany

Więc okrężnicy należy uciekł.

+0

dziękuję Shane - postawiłem pytanie bardziej szczegółowe na temat, co mogłoby mi pomóc – Greg

0

Jeśli zostanie znaleziony dwukropek, spróbuje przeanalizować wartość podążającą za dwukropkiem jako numer portu i zakończy się niepowodzeniem, jeśli nie podasz poprawnego numeru portu. Zobacz here na przykład podobny problem i MSDN link for UriFormatException details.

+0

dzięki Tanner - Zrobiłem pytanie bardziej szczegółowe, co by mi pomogło – Greg

Powiązane problemy