Laden...

IDN/IRI Support für die URI Klasse aktivieren

Erstellt von Hirnhamster vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.932 Views
H
Hirnhamster Themenstarter:in
103 Beiträge seit 2010
vor 12 Jahren
IDN/IRI Support für die URI Klasse aktivieren

Hey,
ich versuche gerade den IDN/IRI Support für die URI Klasse zu aktivieren. In erster Linie geht es dabei um Uri.IsWellFormedUriString Methode, mit der auf Webseiten vorkommende URLs auf ihre Gültigkeit prüfen will.

In Uri Class unter "International Resource Identifier Support" wird folgende Lösung vorgeschlagen:

Specify whether you want Internationalized Domain Name (IDN) parsing applied to the domain name and whether IRI parsing rules should be applied. This can be done in the machine.config or in the app.config file. For example, add the following:

<configuration>
  <uri>
  <idn enabled="All" />
  <iriParsing enabled="true" />
  </uri>
</configuration>

Leider hat das bei mir nicht funktioniert. Meine bisherige app.config sieht ungefähr so aus (beinhaltet also erstmal nur meine Settings-Dateien):

<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="..." type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        <!-- ... some sections in here ... -->
        </sectionGroup>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <!-- ... some sections in here ... -->
        </sectionGroup>
    </configSections>
    <userSettings>
        <!-- ... some settings in here ... -->
    </userSettings>
    <applicationSettings>
        <!-- ... some settings in here ... -->
    </applicationSettings>
</configuration>

Wenn ich die oben vorgeschlagene Lösung als Kind-Element von dem <configuration> Tag am Ende hinzufüge, speichere und das Programm starte, erhalte ich eine Fehlermeldung:

ConfigurationErrorsException - {"Das Konfigurationssystem konnte nicht initialisiert werden."}

Hab leider keine Ahnung, woran das liegt und wie ich die beheben kann.

Weiterhin habe ich folgenden Absatz in Uri Class gefunden:

IRI and IDN processing in the Uri class can also be controlled using the
>
,
>
, and
>
configuration setting classes. The System.Configuration.IriParsingElement setting enables or disables IRI processing in the Uri class. The System.Configuration.IdnElement setting enables or disables IDN processing in the Uri class. The System.Configuration.IriParsingElement setting also indirectly controls IDN. IRI processing must be enabled for IDN processing to be possible. If IRI processing is disabled, then IDN processing will be set to the default setting where the .NET Framework 2.0 behavior is used for compatibility and IDN names are not used.

Leider gibt es in den entsprechenden Klassen kein Anwendungsbeispiel und ich hab keine Ahnung, wie ich diese Klassen benutzen soll, um den IDN Support zu aktivieren.

Bin für jede Hilfe dankbar!

PS: Hab die Frage auch bei StackOverflow gestellt How to enable IDN/IRI Support for URI-Class by code? aber bisher gab es noch keine Reaktionen..

Grüße
Pascal

Hinweis von herbivore vor 9 Jahren

Bitte vor dem Crossposten eine angemessene Zeit warten, also in der Regel mindestens 48 Stunden nach der jeweils letzten Antwort. Im konkreten Fall hat sich zwar nachträglich herausgestellt, dass innerhalb der 48 Stunden tatsächlich keine Antwort in dem anderen Forum kam, aber das konntest du vorher nicht wissen.

PHP Tutorials zum PHP lernen

H
Hirnhamster Themenstarter:in
103 Beiträge seit 2010
vor 12 Jahren

Keiner 'nen Hinweis für mich 😕?

PHP Tutorials zum PHP lernen

16.842 Beiträge seit 2008
vor 12 Jahren

Welchen Sinn hat es denn, für jede URI die am Server ankommt, eine Prüfung zu vollziehen...?
Das muss doch mächtig die Performance kosten. 🤔

Beschreib doch mal, wieso Du das tun willst; vielleicht ergibt sich eine bessere Lösung..... Ansonsten seh ich bei dem Thema eher verhaltene Resonanz..

H
Hirnhamster Themenstarter:in
103 Beiträge seit 2010
vor 12 Jahren

Die URLs kommen nicht am Server an. Das ist ein WinForms Projekt, mit dem Webseiten gecrawlt werden können.

Der Anwendungsfall besteht darin, alle URLs in einem Webdokument in absolute URLs umzuwandeln. Im ersten Schritt werden alle URLs im Dokument gesucht (href und src Attribute), danach wird für jede URL geprüft, ob sie bereits absolut oder relativ ist:

        public static bool IsAbsoluteUrl(string url)
        {
            try
            {
                // strip fragment due to bug in .Net : http://stackoverflow.com/a/8634041/413531
                String tmpUrl = url.Split(new char[] { '#' })[0];
                if (!Uri.IsWellFormedUriString(tmpUrl, UriKind.RelativeOrAbsolute))
                {
                    throw new ArgumentException("URL was in an invalid format", tmpUrl);
                }
                return Uri.IsWellFormedUriString(tmpUrl, UriKind.Absolute);
            }
            catch(Exception e) {
                Console.WriteLine(url);
                throw e;
            }
        }

Wenn die URL bereits absolut ist, wird sie unverändert zurückgegeben. Wenn sie relativ ist, wird sie mit new Uri(theBase, urlToAbsolutize); mit der URL des Webdokumentes verknüpft und mittels absoluteUri.AbsoluteUri zurückgegeben.

        public static String GetAbsoluteUrl(String urlToAbsolutize, String baseUri)
        {
            try
            {

            if (IsAbsoluteUrl(urlToAbsolutize))
                return urlToAbsolutize;
            else
            {
                Uri theBase = new Uri(baseUri);
                Uri absoluteUri = new Uri(theBase, urlToAbsolutize);
                return absoluteUri.AbsoluteUri;
            }

            }
            catch {
                return urlToAbsolutize;
            }
        }

Leider klappt das nicht mehr, wenn die Domains Umlaute enthalten, weil Uri.IsWellFormedUriString dann ständig einen Fehler wirft - auch wenn die URL eigentlich korrekt ist. Leider kommt das in der Realität aber häufig vor, deshalb kann ich den Fall nicht einfach ausklammern.

PHP Tutorials zum PHP lernen

16.842 Beiträge seit 2008
vor 12 Jahren

Adressen mit Umlauten sind im Prinzip auch ungültig, diese müssen umgeformt werden; wobei hier die Handhabung zwischen Domains mit Umlauten und Parametern mit Umlauten unterschiedlich ist.

H
Hirnhamster Themenstarter:in
103 Beiträge seit 2010
vor 12 Jahren

Jain nicht ganz. Früher war das so, gemäß RFC 2396 und RFC 2732.

Mit dem neueren Standard RFC 3987 ist das aber erlaubt. Zumindest wenn ich Uri Class richtig verstehe:

With the growth of the Internet, there is a growing need to identify resources using languages other than English. Identifiers which facilitate this need and allow non-ASCII characters (characters in the Unicode/ISO 10646 character set) are known as International Resource Identifiers (IRIs). The specifications for IRIs are documented in RFC 3987 published by IETF. Using IRIs allows a URL to contain Unicode characters.

Und um das zu unterstützen, muss man eben den IRI Support aktivieren - genau das bekomm ich aber nicht hin 😃

Wenn Dir eine andere Lösung einfällt, wär mir das natürlich auch recht 😉

PHP Tutorials zum PHP lernen

H
Hirnhamster Themenstarter:in
103 Beiträge seit 2010
vor 12 Jahren

push..

PHP Tutorials zum PHP lernen

3.170 Beiträge seit 2006
vor 12 Jahren

Hallo,

mit welcher Version von .NET arbeitest Du denn? Sieht so aus als würde das erst ab :NET 4.0 auf diese Weise unterstützt. Auch wenn es für 3.5 schon dokumentiert ist - da muss wohl auf jeden Fall noch eine zusätzliche Config-Section mit rein.
Siehe Converting domain names from russian to universal, die letzten beiden Beiträge.

Gruß, MarsStein

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

H
Hirnhamster Themenstarter:in
103 Beiträge seit 2010
vor 12 Jahren

Hey MarsStein,
das hat geholfen 😃 Sehr cool!

Ich verwende tatsächlich .Net 3.5 und mit dem Hinzufügen von

<section name="uri" type="System.Configuration.UriSection, System,
                          Version=2.0.0.0, Culture=neutral,
                          PublicKeyToken=b77a5c561934e089" />

wird nun auch kein Fehler mehr geworfen. Der Vollständigkeit noch das komplette Konstrukt:

<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="..." type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        <!-- ... some sections in here ... -->
        </sectionGroup>
        <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
        <!-- ... some sections in here ... -->
        </sectionGroup>

<!-- ... insert Missing section ... -->

        <section name="uri" type="System.Configuration.UriSection, System,
                          Version=2.0.0.0, Culture=neutral,
                          PublicKeyToken=b77a5c561934e089" />

    </configSections>

<!-- ... insert URI settings ... -->

    <uri>
        <idn enabled="All" />
        <iriParsing enabled="true" />
    </uri>

    <userSettings>
        <!-- ... some settings in here ... -->
    </userSettings>
    <applicationSettings>
        <!-- ... some settings in here ... -->
    </applicationSettings>
</configuration>

PHP Tutorials zum PHP lernen