Самостоятельно размещенный сервис WCF имеет HttpContext.Current == ноль, несмотря на то, что AspnetCompability позволил - PullRequest
2 голосов
/ 29 июня 2010

Я использую самодостаточный (программно размещенный) WCF-сервис в веб-приложении. Я поместил атрибут [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] в класс SampleService и поместил элемент <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false"/> в файл Web.config в разделе system.serviceModel. Я размещаю свой WCF-сервис в Global.asax в методе Application_Start, используя следующий код:

protected void Application_Start(object sender, EventArgs e)
{
  var serviceType = typeof (SampleService);
  var serviceInterfaceType = typeof(ISampleService);
  var baseAddresses = new Uri(@"https://localhost:443/SilverWIF.WEB/SampleService");
  var serviceHost = new ServiceHost(serviceType, baseAddresses);
  var smb = serviceHost.Description.Behaviors.Find<ServiceMetadataBehavior>();
  if (smb == null)
  {
        smb = new ServiceMetadataBehavior { HttpsGetEnabled = true };
        serviceHost.Description.Behaviors.Add(smb);
  }
  else smb.HttpsGetEnabled = true;

  var sdb = serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>();
  if (sdb == null)
  {
        sdb = new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true };
        serviceHost.Description.Behaviors.Add(sdb);
  }
  else sdb.IncludeExceptionDetailInFaults = true;

  serviceHost.Description.Endpoints.Clear();
  serviceHost.AddServiceEndpoint(serviceInterfaceType, _getGustomBinding(), string.Empty);

  serviceHost.Open();
}

private static CustomBinding _getGustomBinding()
{
    var binaryMessageEncodingBindingElement = new BinaryMessageEncodingBindingElement();
    var httpsTransportBindingElement = new HttpsTransportBindingElement();
    var binding = new CustomBinding(binaryMessageEncodingBindingElement, httpsTransportBindingElement);
    return binding;
}

Несмотря на все это, у меня HttpContext.Current == null (я пытаюсь получить к нему доступ одним из методов класса SampleService).

Возможно ли получить доступ к HttpContext.Current, когда WCF-сервис программно размещен? Кто-нибудь может мне помочь с этой проблемой?

1 Ответ

0 голосов
/ 29 июня 2010

Если ваш веб-сайт размещен в IIS7, в Integrated Pipeline произошли изменения, которые делают контекст запроса недоступным в событии Application_Start.При использовании классического режима [НЕ РЕКОМЕНДУЕТСЯ] (единственный режим, работающий в предыдущих версиях IIS), контекст запроса раньше был доступен, даже если событие Application_Start всегда предназначалось как глобальное и запрос-Агностическое событие в жизни приложения.Причина, по которой это можно сделать (должно ли это быть сделано, является другим обсуждением) в классическом режиме IIS6 или IIS7, заключается в том, что приложения ASP.NET всегда запускались при первом запросе к приложению, поэтому было возможно получить доступ к контексту запросачерез статический HttpContext.Current.

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

Надеюсь, это поможет.

...