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

时间:2014-04-02 16:20:32

标签: c# wcf uri wildcard discovery

我的目的是:

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

以前的答案:

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

我的问题:

当我运行主机控制台应用程序时,会抛出异常:

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构造函数不接受带有* char里面的uriString参数


下一个主题:使用上面的源代码,我的客户端在运行时获取uri,但是这个uri包含 MY_COMPUTER_NAME ,如http://MY_COMPUTER_NAME:7400/WcfPing,其中包含

http://MY_IP_ADDRESS:7400/WcfPing

有没有办法获取实际的IP地址? (我有不同本地网络的多个NIC)

1 个答案:

答案 0 :(得分: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)