尽管AspnetCompability允许,但自托管WCF服务具有HttpContext.Current == null

时间:2010-06-29 12:53:56

标签: c# wcf web-applications self-hosting

我在Web应用程序中使用自托管(以编程方式托管)的WCF服务。 我将[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]属性放在SampleService类中,并将<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false"/>元素放到system.serviceModel部分的Web.config中。 我正在使用下一个代码在Application_Start方法中在Global.asax中托管我的WCF服务:

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类的一个方法中访问它。)

当以编程方式托管WCF服务时,可以访问HttpContext.Current吗?有人可以帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:0)

如果您的网站托管在IIS7中,则集成管道的更改会使Application_Start事件中的请求上下文不可用。使用经典模式 [NOT RECOMMENDED] (在以前版本的IIS上运行时唯一的模式)时,请求上下文过去可用,即使Application_Start事件始终是全局的,应用程序生命周期中的请求不可知事件。在IIS6或IIS7经典模式中可以完成此操作(是否应该完成另一个讨论)的原因是因为ASP.NET应用程序始终是由对应用程序的第一个请求启动的,因此可以访问请求上下文通过静态HttpContext.Current。

除了上述解释之外,我不建议在网站内以这种方式托管您的服务。在IIS(How to implement a self-hosted service in a console application

中查看此链接以进行托管

希望这有帮助。