Программный доступ к WCF EndPoint URL - PullRequest
1 голос
/ 24 марта 2009

У меня есть служба WCF, размещенная на IIS (настроенная, как описано в в этом сообщении в блоге ... Мне нужно знать, что представляет собой 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' в строковую переменную в событии onstart веб-приложения.

Ответы [ 2 ]

4 голосов
/ 03 апреля 2009

ОК, поэтому краткий ответ: «Вы не можете». Чем дольше ответ, тем лучше, немного поработав.

Если вы размещаете это вне IIS, на самом деле разумно загрузить сам раздел конфигурации и проанализировать его, так как вы можете привести его к классу конфигурации WCF:

ServiceModelSectionGroup serviceModelGroup =
      cfg.GetSectionGroup("system.serviceModel") 
            as ServiceModelSectionGroup;

Немного грязно, но это работает. Проблема возникает с IIS - размещенные службы IIS наследуют свой адрес от IIS и игнорируют полностью определенные адреса в любом файле конфигурации.

Но вы можете обмануть, вы можете использовать фабрику хостов для пользовательских сервисов. Это означает изменение кода запуска службы в коде или в файле .svc для IIS. Фабрика хоста настраиваемых сервисов происходит от ServiceHostFactory и переопределяет

protected override ServiceHost CreateServiceHost(Type serviceType, 
                                                 Uri[] baseAddresses)

Как видите, вы получаете один или несколько объектов URI, содержащих (потенциальные) адреса вашей службы. На этом этапе вы можете хранить их где-нибудь (возможно, в таблице синглтон-поиска) в зависимости от типа сервиса, а затем запрашивать это в другом месте.

Тогда в вашем файле .svc вам нужно немного его изменить; например

<%@ServiceHost Service="MyService.ServiceName" 
               Factory="MyService.ServiceHostFactory" %>
<%@Assembly Name="MyService" %>
1 голос
/ 12 октября 2010

Если у вас уже есть экземпляр вашего прокси-сервера, вы можете использовать следующее:

    public static Uri GetServiceUri(this IMyService proxy)
    {
        var channel = proxy as IContextChannel;
        return 
              channel != null && channel.RemoteAddress != null ? 
                 channel.RemoteAddress.Uri : null;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...