以编程方式访问WCF EndPoint URL

时间:2009-03-24 20:20:22

标签: wcf iis

我有一个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事件中的字符串变量中。

2 个答案:

答案 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;
    }