托管WCF和Windsor的ASP.NET MVC应用程序:HttpContext.Current为null

时间:2012-08-24 07:48:23

标签: wcf castle-windsor

我已经构建了一个托管WCF服务的ASP.NET MVC 3应用程序。执行实际工作的服务类位于类库中。我正在尝试使用Windsor WCF工具根据服务请求进行连接。

这是我的温莎集装箱工厂:

public class WindsorContainerFactory
{
    private static IWindsorContainer container;
    private static readonly object sync = new Object();

    public static IWindsorContainer Current()
    {
        if(container == null) {
            lock (sync)
            {
                if (container == null)
                {
                    container = new WindsorContainer();
                    container.Install(new ControllerInstaller());
                    container.Install(new NHibernateSessionInstaller());
                    container.Install(new RepositoryInstaller());
                    container.Install(new ServiceInstaller());
                }
            }
        }
        return container;
    }
}

在Global.asax中,我打电话给WindsorContainerFactory.Current()一次,以保证工厂正在建造:

    protected void Application_Start()
    {
        WindsorContainerFactory.Current();
        ControllerBuilder.Current.SetControllerFactory(typeof(WindsorControllerFactory));
        ...

我通过以下课程安装我的服务:

public class ServiceInstaller : IWindsorInstaller
{
    public void Install(Castle.Windsor.IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store)
    {
        container.Kernel.AddFacility<WcfFacility>();
        container.Kernel.Register(
            Component
            .For<ICustomerService>()
            .ImplementedBy<CustomerService>()
            .Named("CustomerService"));
    }
}

然后我向项目添加了一个新的WCF服务,删除了文件后面的代码并修改了svc标记,如下所示:

<%@ ServiceHost Language="C#" Debug="true"    
Factory="Castle.Facilities.WcfIntegration.DefaultServiceHostFactory, 
Castle.Facilities.WcfIntegration" Service="CustomerService" %>

正如你所看到的,windsor中安装了其他组件(存储库,控制器......),但这似乎运行良好。

我的问题是,WCF客户端(控制台应用程序)收到错误: HttpContext.Current为null。 PerWebRequestLifestyle只能在ASP.Net

中使用

客户代码:

        CustomerServiceClient c = new Services.Customers.CustomerServiceClient();
        CustomerResponse resp = c.GetCustomerBySurname("Lolman");
        c.Close();            

有人能指出我正确的方向吗? 提前谢谢!

1 个答案:

答案 0 :(得分:3)

尝试启用AspNetCompatibility。 点击此链接查看help