| 

.NET C# Java Javascript Exception

4
Hallo zusammen
Ich buenutze Folgende Klasse mit Interface:
public interface IUriService
{
void Load();
Uri GetUri(string key);
BitmapImage GetBitmapImage(string key);
object GetAny(string key);
}

public class UriService : IUriService
{

private Dictionary<string, Uri> _uriMapper;


public void Load()
{
_uriMapper = new Dictionary<string, Uri>();
_uriMapper.Add("App", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/AddressSuite_32.ico",true));
_uriMapper.Add("Delete", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/delete.ico", UriKind.RelativeOrAbsolute));
_uriMapper.Add("Exit", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/Exit_New.ico", UriKind.RelativeOrAbsolute));
_uriMapper.Add("Home", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/house.ico", UriKind.RelativeOrAbsolute));
_uriMapper.Add("Print", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/jsPrinter.ico", UriKind.RelativeOrAbsolute));
_uriMapper.Add("New", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/new.ico", UriKind.RelativeOrAbsolute));
_uriMapper.Add("Edit", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/notiz.ico", UriKind.RelativeOrAbsolute));
_uriMapper.Add("Ok", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/ok.ico", UriKind.RelativeOrAbsolute));
_uriMapper.Add("Post", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/post.png", UriKind.RelativeOrAbsolute));
_uriMapper.Add("Save", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/save.ico", UriKind.RelativeOrAbsolute));
_uriMapper.Add("Word", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/Word.ico", UriKind.RelativeOrAbsolute));
_uriMapper.Add("Person", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/Employees.ico", UriKind.RelativeOrAbsolute));
_uriMapper.Add("Title", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/title.ico", UriKind.RelativeOrAbsolute));
_uriMapper.Add("german_Flagg", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/german_flagg.ico", UriKind.RelativeOrAbsolute));
_uriMapper.Add("french_Flagg", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/french_flagg.ico", UriKind.RelativeOrAbsolute));
_uriMapper.Add("leftFlash", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/LeftFlasch.ico", UriKind.RelativeOrAbsolute));
_uriMapper.Add("reightFlash", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/RightFlasch.ico", UriKind.RelativeOrAbsolute));
_uriMapper.Add("PhoneBook", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/phoneBook.ico", UriKind.RelativeOrAbsolute));
_uriMapper.Add("PhoneImport", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/PhoneImport.ico", UriKind.RelativeOrAbsolute));
_uriMapper.Add("Group", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/groupH.ico", UriKind.RelativeOrAbsolute));


}

public Uri GetUri(string key)
{
return _uriMapper[key];
}

public BitmapImage GetBitmapImage(string key)
{
return new BitmapImage(_uriMapper[key]);
}

public object GetAny(string key)
{
return _uriMapper[key];
}

}

Nun habe ich das Problem, nur wenn ich die Klasse aus einen UnitTestProjekt aufrufe, bekomme ich folfende Fehlermeldung:

Ungültiger URI: Es wurde ein ungültiger Anschluss angegeben
bei System.Uri.CreateThis(String uri, Boolean dontEscape, UriKind uriKind)
bei System.Uri..ctor(String uriString, Boolean dontEscape)
bei js.Address.BusinessLayer.UriService.Load() in j:\js.Address\js.Address\js.address.BusinessLayer\Services\UriService.cs:Zeile 24." string

Kann mir jemand sagen, mit welchen Parameter ich die Uri initialisieren soll, oder wie ich den Fehler sonst beheben kann?

Freundliche Grüsse Alex
News:
04.07.2013
Maendler 214 1 7
Kannst Du mal noch angeben, welche Zeile in Deinem geposteten Code die Zeile 24 ist, die den Fehler offenbar verursacht?
Matthias Hlawatsch 04.07.2013
Gibt es einen bestimmten Grund, warum der erste URI mit einem boolschen Parameter im Konstruktor erstellt wird und alle anderen mit einem UriKind-Enum Wert?
Karill Endusa 04.07.2013
Frage von Matthias:
_uriMaper.Add("App", new Uri("pack://application:,,,/js.Address.BusinessLayer;component/Images/AddressSuite_32.ico",true));
Frage Karill:
Das war ein Versuch eine andere Initialisierung der Uri, die jedoch auch nicht ziehlführend war.
Maendler 04.07.2013
Hab mir den Stacktrace nochmal angeschaut, der Fehler müßte demnach bei der ersten Zeile auftreten, die mit dem boolschen Parameter. Wenn Du keinen besonderen Grund dafür hast (siehe Karills Kommentar), dann versuch doch mal einen UriKind-Parameter.

Und versuch doch mal UriKind.Absolute. Schließlich sehen die Uris doch alle sehr absolut aus ;-), da mußt Du .NET nicht noch raten lassen...
Matthias Hlawatsch 04.07.2013
Auch UriKind.Absolute lost ein Fehler aus.
Maendler 04.07.2013
1 Antwort
2
Eigentlich muß man die Fehlermeldung nur ins Englische rückübersetzen, und dann findet man die Antwort bei stackoverflow...

(Wobei ich ehrlich gesagt auch erst soweit debuggt habe, bis ich mir sicher war, dass der URI-Konstruktor ein Problem mit dem pack-Schema hat, und dann nach "uri constructor pack scheme" gegoogelt habe.)

Update:
Eigentlich wird auf der SO-Seite ja alles erklärt, aber hier nochmal in Deutsch: damit der URI-Konstruktor Uris mit dem "pack:"-Schema korrekt parsen kann, muss dieses Schema registriert werden - es ist, anders als http u.ä., nicht von Anfang an bekannt. Diese Registrierung ist Teil des statischen Konstruktors ("type initializer") der Klasse PackUriHelper. Dieser wird ausgeführt, sobald irgendwo auf diese Klasse zugegriffen wird. Das ist offenbar insbesondere im Konstruktor der Application-Klasse der Fall, weshalb dessen Aufruf das Problem löst. Aber eigentlich ist das in einem Unit-Test eine viel zu große Kugel für einen viel zu kleinen Spatzen (auch wenn es nur einmal passiert - dafür sorgt die if-Abfrage), weshalb die zweite angegebene Lösung, also das Auslesen von System.IO.Packaging.PackUriHelper.UriSchemePack, zu bevorzugen ist. Entweder so wie in der bei SO akzeptierten Antwort angegeben, oder in der Version, die der Fragesteller dort am Ende seiner Frage gepostet hat.
04.07.2013
Matthias Hlawatsch 13,2k 4 9
Matthias, danke für den Typ.

Folgende Zeile hat das Problem gelöst:
if (!UriParser.IsKnownScheme("pack")) new System.Windows.Application();

Leider habe ich den Code nicht verstanden und währe froh wenn Du mir diese Zeile erklären würdest.
Maendler 04.07.2013
Siehe das Update meiner Antwort.
Matthias Hlawatsch 04.07.2013
Nochmls Danke für den ausführlichen Update.
Somit ist das Thema für mich erledigt.

Gruss Alex
Maendler 04.07.2013
Freut mich zu lesen. Dann würde ich mich noch freuen, wenn Du die Antwort akzeptieren würdest (durch Klick auf den grünen Haken).
Matthias Hlawatsch 04.07.2013
Genau das habe ich noch gesucht!
Maendler 04.07.2013
Na dann wäre das ja auch geklärt - dankeschön! Mit den Pfeilen kannst Du übrigens Antworten (auch bei "fremden" Fragen) bewerten.
Matthias Hlawatsch 04.07.2013

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH