Сервис WCF, как получить URL веб-сайта из библиотеки классов?

Ctrl + Сдвиг + R -> Осуществляют рефакторинг с Resharper

9
задан John Saunders 16 July 2010 в 18:51
поделиться

3 ответа

Вы можете создать ServiceHostFactory, который запускает ваш хост службы вручную, а затем сохранить адрес конечной точки в статическом классе, который будет использоваться вашим приложением. Вот простой пример:

(в вашем myService.svc):

<%
 @ServiceHost
 Service="MyNamespace.MyService" 
 Factory="MyNamespace.MyServiceHostFactory"
  %>

(в вашем MyServiceHostFactory.cs):

/// <summary>
/// Extends ServiceHostFactory to allow ServiceHostFactory to be used.
/// </summary>
public class MyServiceHostFactory : ServiceHostFactory
{
    /// <summary>
    /// Creates a new ServiceHost using the specified service and base addresses.
    /// </summary>
    /// <param name="serviceType"></param>
    /// <param name="baseAddresses"></param>
    /// <returns></returns>
    protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
    {
        ServiceHost host;
        host = new ServiceHost(serviceType, baseAddresses);

        MyGlobalStaticClass.Address = baseAddresses[0]; // assuming you want the first endpoint address.

        return host;
    }

(В вашем MyGlobalStaticClass.cs):

  public static string Address = "";
4
ответ дан 4 December 2019 в 06:49
поделиться

I'm not too hot on WCF as I'm more used to .Net 2.0, but would this do it?

HttpContext.Current.Request.Url.ToString()

That should give you the url of the calling request. The catch here is that you could possibly have multiple domains or virtual directories pointing to the same service and it will only give you the url the client specified. However if you have multiple entry points, there is no "one" url anyway.

2
ответ дан 4 December 2019 в 06:49
поделиться

Начну с предположения, что вы используете HTTP - я уверен, что вы можете скорректировать подход в зависимости от того, что диктуют ваши конкретные условия. Я также пытался получить ответ, используя HttpContext, и обнаружил, что при запуске под Cassini значение равно null, поэтому я попробовал альтернативный подход.

System.ServiceModel.OperationContext содержит правильный контекст запроса. Вы можете проследить запрос вплоть до фактического сообщения запроса и вычистить заголовок.

Uri requestUri = System.ServiceModel.OperationContext.Current.RequestContext.RequestMessage.Headers.To;
25
ответ дан 4 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: