我正在尝试创建类 EndpointAddress 的实例,其中参数包含德语变音符号。
例如:
EndpointAddress endpointAddress = new EndpointAddress("net.tcp://süd:8001/EmployeeService");
它总是抛出给定 uri 无法解析的异常。我试图用编码值替换变音符号,但我得到了同样的异常:
无效的 URI:无法解析主机名。
以前有人遇到过同样的问题吗?先感谢您。
解析器可能不知道如何使用国际化域名(IDN)。如果你想拥有这样的主机名,你将不得不自己进行 Punycode 编码。我没用过,但是有一个核心函数IdnMapping.GetAscii看起来很合适——比如
EndpointAddress endpointAddress = new EndpointAddress(
"net.tcp://" + IdnMapping.GetAscii("süd") + ":8001/EmployeeService"
);
也许会起作用(如果没有,请原谅我,C# 不是我的语言)。
就像一个额外的说明。WCF 在 .Net 4.5 中添加了对 IDN 的支持(用于托管服务 + WCF 客户端与具有 IDN 名称的服务通信)。本文档有一些关于此的信息。
因此,一旦您针对 .net 4.5 编译应用程序,此异常就会消失
正如建议的那样,您必须在使用这种 URI 之前启用 IRI 和 IDN 解析。
将此添加到您的 app.config 中:
<configuration>
<uri>
<idn enabled="All" />
<iriParsing enabled="true" />
</uri>
</configuration>