Служба WCF, как получить URL веб-сайта из библиотеки классов? - PullRequest
9 голосов
/ 01 декабря 2009

У меня есть служба WCF, работающая в IIS, которая вызывает функцию в библиотеке классов, где доступен httpContext. Как я могу динамически получить URL-адрес веб-сайта, это также может быть виртуальный каталог?

Ответы [ 4 ]

25 голосов
/ 16 июля 2010

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

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

Uri requestUri = System.ServiceModel.OperationContext.Current.RequestContext.RequestMessage.Headers.To;
4 голосов
/ 01 декабря 2009

Вы можете создать 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 = "";
3 голосов
/ 25 января 2013

В настоящее время я работаю над службой WCF REST, и у меня есть такие же требования. Мне нужен сервисный URL хоста в моем методе. Ниже приведены различные способы получения хоста / URL службы WCF REST в библиотеке классов.

Вы можете использовать класс WebOperationContext, который доступен в пространстве имен System.ServiceModel.Web для получения URL сервиса. Обратите внимание, что этот класс предназначен только для службы WCF REST.

  1. WebOperationContext.Current.IncomingRequest.Headers["host"] - дает имя хоста службы

  2. WebOperationContext.Current.IncomingRequest.UriTemplateMatch.BaseUri.Host - предоставляет имя хоста службы

  3. WebOperationContext.Current.IncomingRequest.UriTemplateMatch.BaseUri.AbsoluteUri - Предоставляет полный URL-адрес службы

  4. WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri.AbsoluteUri - Предоставляет полный URL-адрес службы

Подробнее о WebOperationContext классе можно узнать на MSDN

2 голосов
/ 01 декабря 2009

Я не слишком увлечен WCF, так как я больше привык к .Net 2.0, но будет ли это делать?

HttpContext.Current.Request.Url.ToString()

Это должно дать вам URL запроса вызова. Уловка в том, что вы можете иметь несколько доменов или виртуальных каталогов, указывающих на одну и ту же службу, и она даст вам только URL, указанный клиентом. Однако, если у вас есть несколько точек входа, в любом случае не будет «одного» URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...