Dienstag, 22. April 2008

URI - Scheme erkennen?

Wie finde ich am einfachsten das URI Schema in einem String mit einer vermeidlichen URI?

Nun mein erster Gedanke ist ich komme wohl nicht herum mit einer Liste gegenzuprüfen

Der Ansatz: suche nach ":" Doppelpunkt, setzt voraus das man auch tatsächlich eine vollständige URI bekommen hat. Dies schlägt leider fehl, sobald man einen Host mit einem Port bekommt alla "localhost:80". Unweigerlich wird man wie im C# eigenem Uri Datentyp "localhost" als Schema interpretiert bekommen. Eine Erkennung ob da ein "http://" vorne fehlt, fällt aus.

Bliebe also der Ansatz, ich vergleiche das erhaltene Schema mit bekannten Schemas. Was auch nicht wirklich ideal ist.

Nun, zugegeben die Frage ufert, praktisch gesehen, unnötig aus. Meine Problemstellung war das ich aus einem System einmal Kunden Webadressen mit oder ohne "http://" bekommen kann, und dies entsprechend beim schreiben nach CRM korrigieren soll. Doch halt! Da war noch was? Genau "https://", ergo ergab sich schnell die Frage ob ich es allgemein abfragen kann...

Doch das funktioniert leider nicht da URI nur als Zeichenkette aus Buchstaben, Zahlen, -, +, . definiert ist vor einem : . Damit ist eine Verwechslung nicht ausgeschlossen mit einem Hostnamen dem eine Portdeklaration folgt!

Mein aktueller Ansatz für mein ganz eigenes spezielles Problem geht in Richtung if(!stringX.Contains(@"://")) ... damit lasse ich ganz bewußt URI Schemas wie file: oder mailto: ausfallen, da die in meinem Fall maximal unwahrscheinlich sind als Kundenadressen, es aber sehr viel wahrscheinlicher ist das ich eine unvollständige Adresse im Stile xyz.de:5000 bekomme.

Gibt es eine schönere, allgemeinere Lösung?

6 Kommentare:

TerA hat gesagt…

Hoi,

ich denke ich habe eine "bessere" Lösung :)

Ich habe Sie jetzt nicht ausprogrammiert da ich jetzt kein .NET hier am laufen habe, aber ich denke das man es ungefähr so machen kann/sollte.

Es gibt einen Klasse namens "Uri" im Namespace System (http://msdn2.microsoft.com/en-us/library/system.uri(VS.71).aspx) . Damit lässt sich eine Uri instanziieren:

Uri siteUri = new Uri("http://www.ntcomp.de/");

Wenn das nicht funktioniert, ist es auch keine gültige Uri. Somit könnte man mit einem Try/Catch Blog das ganze abfangen:

try
{ new Uri("http://www.ntcomp.de/"); }
catch(Exception)
{ // FEHLERBEHANDLUNG DA KEINE URI }

Muss mal jemand probieren hier...

CU TerA

TerA hat gesagt…

ähh.. natürlich meinte ich:

try
{ Uri siteUri = new Uri("http://www.ntcomp.de/"); }
catch(Exception)
{ // FEHLERBEHANDLUNG DA KEINE URI }

Tropensturm hat gesagt…

yo schon probiert ;) aber leider scheitert URI genau an dem beschrieben Problem wenn man ihm etwas wie meineaddy:8080 gibt, dann gibt er meineaddy als URI Schema an, daher hab ich meine Contains vorgezogen...

TerA hat gesagt…

Ahh ja... jetzt... jaja... alles Lesen soll manchmal vor sinnbefreiten Kommentaren schützen ;)

Tropensturm hat gesagt…

Nunja die Idee ist ja nicht dumm :)

Uri u = new Uri("http://www.google.com");

u.Scheme <- "http"

schön handlich an sich... nur kann ich leider bei meinem Problem nicht davon ausgehen (also die Regel, nicht die Ausnahme) das ich die korrekte URI kriege.

Prinzipiell hab ich sowieso "verwachst", weil ich ja nicht einmal weiß ob es http oder https ist. Ich könnte es nicht mal nachprüfen, ...da mehrere der URLs nur innerhalb eines Firmenübegreifenden VPN Netzwerkes zu erreichen sind und von außen maximal eine 401 liefern.

Somit muss ich sowieso die gewagte Annahme machen, das der "Eingebende" weiß was er tut (welch Wahnsinn), und wenn es eine https ist das schon mit angibt... und wenn es nicht da ist nehm ich einfach eine http an...

Ich hab schon überlegt, ob ich nach : prüfen soll ob es ein Port ist. Da dieser eine Nummer zwischen 0 und 65535 sein muss und wenn danach ein / oder nichts nach kommt, muss es wohl ein Port sein... aber irgendwo hörts mit Aufwand und Mehrnutzen auf :(

Anonym hat gesagt…

Warum nicht über einen Regulären Ausdruck?