WCF 发现:System.UriFormatException 使用带有通配符 (*) 的 URI 创建 ServiceHost

问题描述 投票:0回答:1

我的目的是:

运行自托管WCF服务,其基地址在运行时根据可用网卡设置;客户发现服务并获取地址。

之前的回答:

我找到了相同的目的和建议的解决方案这里

我的问题:

当我运行托管控制台应用程序时,此处抛出异常:

var host = new ServiceHost(typeof(WcfPingTest), new Uri("http://*:7400/WcfPing"));

异常详细信息:System.UriFormatException:无效的 URI:无法解析主机名

如果我将 * 替换为 localhost,它可以工作,但它不能满足我的任务,即:从客户端获取真实的 IP 地址,而不是硬编码的地址。

我也尝试在 app.config 文件中执行此操作,但例外是相同的:

我哪里做错了?

其他信息:C# 代码、.NET Framework 4.5


更新: 通配符的使用可以在 app.config 文件中使用:

<baseAddresses><add baseAddress="http://*:7400/WcfPing" /></baseAddresses>

在控制台应用程序中:

var host = new ServiceHost(typeof(WcfPingTest))

另一方面,

Uri
构造函数不接受内部带有*字符的uriString参数


下一个主题:使用上面的源代码,我的客户在运行时获取 uri,但此 uri 包含 MY_COMPUTER_NAME,如

http://MY_COMPUTER_NAME:7400/WcfPing
,而不是

http://MY_IP_ADDRESS:7400/WcfPing

有什么方法可以获取真实的IP地址吗? (我有多个网卡用于不同的本地网络)

c# wcf uri wildcard wcf-discovery
1个回答
1
投票

出现异常是因为uriString对于Uri无效。 关于配置文件中的通配符,请检查您的配置文件是否相似

<system.serviceModel>
    <services>
        <service name="Nelibur.ServiceModel.Services.JsonServicePerCall">
            <host>
                <baseAddresses>
                    <add baseAddress="http://*:9095/feedback" />
                </baseAddresses>
            </host>
            <endpoint binding="webHttpBinding"
                      contract="Nelibur.ServiceModel.Contracts.IJsonService" />
        </service>
    </services>
</system.serviceModel>

并且

new ServiceHost
不包含
new Uri
,也许你只是忘记了

var host = new ServiceHost(typeof(WcfPingTest)
© www.soinside.com 2019 - 2024. All rights reserved.