2013-02-20 14 views
6

Sto provando a creare un'istanza di classe EndpointAddress dove il parametro contiene umlaut tedesca.dieresi tedesche in EndpointAddress con net.tcp

Per esempio:

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

Getta sempre un'eccezione che URI non può essere analizzato. Ho provato a sostituire l'umlaut con un valore codificato, ma ottengo la stessa eccezione:

URI non valido: il nome host non può essere analizzato.

Qualcuno aveva avuto lo stesso problema prima? Grazie in anticipo.

+0

Com'era la conversione? Cosa dice l'eccezione? –

+1

'new EndpointAddress (" net.tcp: // süd: 8001/EmployeeService ")' funziona correttamente con me su .net4.5. Stai usando una versione precedente? – spender

+2

Hai provato a abilitare l'analisi [International Resource Identifier (IRI)] (http://msdn.microsoft.com/en-us/library/bb968786.aspx)? [] (http://msdn.microsoft.com/en-us/library/bb882600.aspx) Si potrebbe anche provare a abilitare l'analisi [ID DNS (Internationalized Domain Name)] (http://msdn.microsoft.com/en -us/library/bb968786.aspx). [] (http://msdn.microsoft.com/en-us/library/bb882553.aspx) – dtb

risposta

4

Il parser probabilmente non sa come lavorare con internationalized domain names (IDN). Se vuoi avere tali nomi di host, dovrai eseguire la codifica di Punycode da solo. Non ho usato, ma c'è una funzione fondamentale IdnMapping.GetAscii che sembra adatto - qualcosa come

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

sarà forse lavorare (mi perdoni se non lo fa, C# non è la mia lingua).

+0

punycode. Non lo sapevo. – spender

+0

Hobbs, grazie per la risposta. Ora, sto affrontando un altro problema. Penso che la causa sia la stessa. Successivamente, sto cercando di creare un'istanza di DuplexChannelFactory. Ho: _factory = new DuplexChannelFactory (new InstanceContext (callbackImplementation), binding, endpointAddress); _channel = _factory.CreateChannel(); (_channel come ICommunicationObject) .Open(); Si blocca su Open().Dopo aver usato IdnMapping ottengo net.tcp: // xn - sd-xka: 8001/EmployeeService. Dopo aver eseguito Open() lancia CommunicationException con il messaggio "Nessuna voce DNS esiste per l'host xn - sd-xka.". Grazie – Nenad

+0

@Nenad non è lo stesso problema; non puoi semplicemente collegarti a un host che non esiste. :-P – hobbs

-2

Provare a usare

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

Cercare here per ulteriore riferimento.

1

Come suggerito, è necessario abilitare l'analisi IRI e IDN prima di utilizzare questo tipo di URI.

Aggiungi questo al vostro app.config:

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

Proprio come una nota in più. WCF ha aggiunto il supporto per IDN (sia per il servizio di hosting + client WCF che parla con un servizio con nome IDN) in .Net 4.5. Questo documentation ha alcune informazioni a riguardo.

Quindi questa eccezione scomparirà non appena si compila la tua app contro .net 4.5

Problemi correlati