2013-02-20 1 views
6

Próbuję utworzyć instancję klasy EndpointAddress, gdzie parametr zawiera niemiecki umlaut.Niemieckie umlauty w EndpointAddress z net.tcp

Na przykład:

EndpointAddress endpointAddress = new EndpointAddress("net.tcp://süd:8001/EmployeeService"); 

Zawsze rzuca wyjątek, że dany URI nie może być analizowany. Próbowałem zastąpić umlaut zakodowaną wartością, ale otrzymuję ten sam wyjątek:

Nieprawidłowy identyfikator URI: nie można przeanalizować nazwy hosta.

Czy ktoś miał wcześniej ten sam problem? Z góry dziękuję.

+0

Jak wyglądała ta konwersja? Co mówi ten wyjątek? –

+1

'new EndpointAddress (" net.tcp: // süd: 8001/EmployeeService ")' działa dobrze dla mnie na .net4.5. Czy używasz starszej wersji? – spender

+2

Czy próbowałeś włączyć funkcję [International Resource Identifier (IRI) parsowanie] (http://msdn.microsoft.com/en-us/library/bb968786.aspx)? [] (http://msdn.microsoft.com/en-us/library/bb882600.aspx) Można również spróbować włączyć analizowanie [IDN (Internationalized Domain Name)] (http://msdn.microsoft.com/pl -us/library/bb968786.aspx). [] (http://msdn.microsoft.com/en-us/library/bb882553.aspx) – dtb

Odpowiedz

4

Parser prawdopodobnie nie wie, jak pracować z internationalized domain names (IDN). Jeśli chcesz mieć takie nazwy hostów, będziesz musiał sam wykonać kodowanie Punycode. Nie używałem go, ale nie jest to funkcja, która wygląda rdzeń IdnMapping.GetAscii nadaje - coś jak

EndpointAddress endpointAddress = new EndpointAddress(
    "net.tcp://" + IdnMapping.GetAscii("süd") + ":8001/EmployeeService" 
); 

będzie może działać (wybacz mi, jeśli tak nie jest, C# nie jest mój język).

+0

. Nie wiedziałem o tym. – spender

+0

Hobbs, dziękuję za odpowiedź. Teraz mam do czynienia z innym problemem. Myślę, że ta przyczyna jest taka sama. Następnie próbuję utworzyć instancję DuplexChannelFactory. Mam: _factory = new DuplexChannelFactory (new InstanceContext (callbackImplementation), binding, endpointAddress); _channel = _factory.CreateChannel(); (_channel as ICommunicationObject) .Open(); To zawiesza się na Open().Po użyciu IdnMapping uzyskuję net.tcp: // xn - sd-xka: 8001/EmployeeService. Po uruchomieniu Open() wyrzuca wyjątek CommunicationException z komunikatem "Brak wpisów DNS dla hosta xn - sd-xka.". Dziękuję – Nenad

+0

@Nenad to nie ten sam problem; po prostu nie można połączyć się z hostem, który nie istnieje. :-P – hobbs

-2

spróbuje użyć

string uri = System.Uri.EscapeDataString("net.tcp://süd:8001/EmployeeService"); 

Look here dalszego odniesienia.

1

Zgodnie z sugestią należy włączyć analizę IRI i IDN przed użyciem tego rodzaju identyfikatora URI.

Dodaj to do swojej app.config:

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

tylko jako dodatkowe noty. WCF dodał obsługę IDN (zarówno dla hosta usługi + klienta WCF rozmawiającego z usługą o nazwie IDN) w .Net 4.5. Ten documentation ma kilka informacji na ten temat.

Ten wyjątek zniknie, gdy tylko skompilujesz swoją aplikację z .net 4.5