我有一个IIS托管的WCF服务(按照this blog post中的描述配置...我需要知道配置的端点的URL是什么。例如,给定此配置:
<system.serviceModel>
<services>
<service behaviorConfiguration="mexBehavior" name="Sc.Neo.Bus.Server.MessageProxy">
<endpoint address="http://localhost:9000/MessageProxy.svc" binding="basicHttpBinding"
contract="Sc.Neo.Bus.IMessageProxy" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="BusWeb.Service1Behavior">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
<behavior name="mexBehavior">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
我希望能够将值“http://localhost:9000/MessageProxy.svc
”放入Web应用程序的onstart事件中的字符串变量中。
答案 0 :(得分:4)
好的,所以简短的回答是“你不能”。更长的答案是你可以,有点,有点工作。
如果您在IIS之外托管这个,那么加载配置部分本身并解析它是合理的,因为您可以将其转换为WCF配置类:
ServiceModelSectionGroup serviceModelGroup =
cfg.GetSectionGroup("system.serviceModel")
as ServiceModelSectionGroup;
有点乱,但确实有效。问题来自IIS - IIS托管服务从IIS继承其地址,并将忽略任何配置文件中的完全限定地址。
但你可以作弊,你可以使用自定义服务主机工厂。这意味着在代码或IIS的.svc文件中更改服务启动代码。自定义服务主机工厂派生自ServiceHostFactory并覆盖
protected override ServiceHost CreateServiceHost(Type serviceType,
Uri[] baseAddresses)
正如您所看到的,您正在获取一个或多个包含服务(潜在)地址的URI对象。此时,您可以将它们存储在某个位置(可能是单例查找表),然后在其他地方查询。
然后在你的.svc文件中你需要稍微修改一下;例如
<%@ServiceHost Service="MyService.ServiceName"
Factory="MyService.ServiceHostFactory" %>
<%@Assembly Name="MyService" %>
答案 1 :(得分:1)
如果您已经创建了服务代理的实例,则可以使用以下命令:
public static Uri GetServiceUri(this IMyService proxy)
{
var channel = proxy as IContextChannel;
return
channel != null && channel.RemoteAddress != null ?
channel.RemoteAddress.Uri : null;
}