0

我几乎完成了一次大的 NHibernate 升级,最终也成为了 Castle 升级。除了 ASP.NET 网站无法运行之外,我已经快到了,因为我在 ServiceSecurityContext.Current 为空时遇到错误。我可能是错的(我还是 Castle 的新手),但我认为这与我对注册 WCF 设施所做的更改有关。

以前(在一个名为 ServiceLocator.cs 的类中)有这样的代码:

    /// <summary>
    /// Register the WindsorServiceHostFactory with the container
    /// </summary>
    public static void RegisterWcfServer()
    {
        RegisterWcfFacility();
        DefaultServiceHostFactory.RegisterContainer(Container.Kernel);
    }

RegisterWcfFacility() 方法如下所示:

    private static void RegisterWcfFacility()
    {
        IFacility[] facilities = Container.Kernel.GetFacilities();
        bool hasWcfFacility = false;
        foreach (IFacility facility in facilities)
        {
            if (facility.GetType() != typeof (WcfFacility)) 
                continue;

            hasWcfFacility = true;
            break;
        }

        if (!hasWcfFacility)
            Container.AddFacility<WcfFacility>();
    }

随后我把它改成了这个(因为我试图让它明显编译,而 DefaultServiceHostFactory 不再有“RegisterContainer”方法):

    /// <summary>
    /// Register the WindsorServiceHostFactory with the container
    /// </summary>
    public static void RegisterWcfServer()
    {
        RegisterWcfFacility();

        // see:  http://stackoverflow.com/questions/9729395/castlewindsor-3-0-and-defaultservicehostfactory-registercontainer

        // obsolete:
        //DefaultServiceHostFactory.RegisterContainer(Container.Kernel);           

        Container.Register(Component.For<DefaultServiceHostFactory>());
    }

我的新版本“RegisterWcfFacility()”如下所示:

    private static void RegisterWcfFacility()
    {
        var facilities = Container.Kernel.GetFacilities();
        var hasWcfFacility = facilities.Any(facility => facility.GetType() == typeof (WcfFacility));

        if (!hasWcfFacility)
            Container.AddFacility<WcfFacility>();
    }

我只是发布这个主要是为了问一些问题:我完全是在吠叫错误的树吗?我注册这个设施的方式合法吗?这是否可以解释为什么我的 ServiceSecurityContext.Current 为空?(是的,我已经看到了):

https://groups.google.com/forum/#!topic/castle-project-devel/VOQKW4XlvLM%5B1-25%5D

感谢您的任何建议。干杯,-戴夫

4

1 回答 1

1

我刚遇到同样的问题,在这里找到了答案。原来你只是文件夹 App_Code 中的一个初始化类,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Castle.Windsor;
using Castle.Facilities.WcfIntegration;

namespace YourNamespace
{
    public static class InitialiseService
    {
        public static void AppInitialize()
        {
            var container = new WindsorContainer();

            container.AddFacility<WcfFacility>();
        }
    }
}

当然,这依赖于从包管理器通过以下方式安装的 WCF Castle Facility:

install-package Castle.WcfIntegrationFacility

希望这可以帮助 :)

于 2012-08-23T02:50:03.367 回答