Asp.net mvc 4 WebApi 2、Castle Windsor、Glass mapper的路由错误

Asp.net mvc 4 WebApi 2、Castle Windsor、Glass mapper的路由错误,asp.net-mvc-4,asp.net-web-api,sitecore,sitecore7,sitecore7.2,Asp.net Mvc 4,Asp.net Web Api,Sitecore,Sitecore7,Sitecore7.2,在阅读了下面两篇文章后,我已经安装了Castle Windsor和WebApi。以下是我的设置要点: 参考员额: 代码设置: public static class GlassMapperScCustom { public static void CastleConfig(IWindsorContainer container) { container.AddFacility<TypedFactoryFacility>(); var

在阅读了下面两篇文章后,我已经安装了Castle Windsor和WebApi。以下是我的设置要点:

参考员额:

代码设置:

public static class GlassMapperScCustom
{
    public static void CastleConfig(IWindsorContainer container)
    {
        container.AddFacility<TypedFactoryFacility>();

        var config = new Config
        {
            UseWindsorContructor = true
        };

        //MVC
        container.Register(Component.For<SitecoreController>().LifestyleTransient());
        container.Register(Types.FromThisAssembly().BasedOn<Controller>().LifestyleTransient());
        DependencyResolver.SetResolver(new WindsorMvcDependencyResolver(container));
        ControllerBuilder.Current.SetControllerFactory(new WindsorMvcControllerFactory(container.Kernel));

        //WebApiInstaller
        container.Register(Types.FromThisAssembly().BasedOn<ApiController>().LifestyleTransient());
        var resolver = new WindsorResolver(container); //Shown Below
        GlobalConfiguration.Configuration.DependencyResolver = resolver;
        GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpControllerActivator), new WindsorWebApiControllerActivator(resolver));
    }
}
public class WindsorMvcDependencyResolver : IDependencyResolver
{
    private readonly IWindsorContainer _container;

    public WindsorMvcDependencyResolver(IWindsorContainer container)
    {
        if (container == null) throw new ArgumentNullException("container");
        _container = container;
    }

    public object GetService(Type serviceType)
    {
        return _container.Kernel.HasComponent(serviceType) ? _container.Resolve(serviceType) : null;
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return _container.ResolveAll(serviceType).Cast<object>().ToArray();
    }
}

public class WindsorMvcControllerFactory : DefaultControllerFactory
{
    private readonly IKernel _kernel;

    public WindsorMvcControllerFactory(IKernel kernel)
    {
        this._kernel = kernel;
    }

    public override void ReleaseController(IController controller)
    {
        _kernel.ReleaseComponent(controller);
    }

    protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
    {
        if (controllerType == null)
        {
            throw new HttpException(404, string.Format("The controller for path '{0}' could not be found.", 
                requestContext.HttpContext.Request.Path));
        }
        return (IController)_kernel.Resolve(controllerType);
    }
}

internal class WindsorResolver : IDependencyResolver, IDependencyScope, IDisposable
{
    private readonly IWindsorContainer _container;

    public WindsorResolver(IWindsorContainer container)
    {
        this._container = container;
    }

    public IDependencyScope BeginScope()
    {
        return new WindsorDependencyScope(this._container);
    }

    public void Dispose()
    {
        this._container.Dispose();
    }

    public object GetService(Type serviceType)
    {
        if (!this._container.Kernel.HasComponent(serviceType))
            return (object)null;
        else
            return this._container.Resolve(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        if (!this._container.Kernel.HasComponent(serviceType))
            return (IEnumerable<object>)new object[0];
        else
            return Enumerable.Cast<object>((IEnumerable)this._container.ResolveAll(serviceType));
    }
}

public class WindsorWebApiControllerActivator : IHttpControllerActivator
{
    private readonly IDependencyResolver _container;

    public WindsorWebApiControllerActivator(IDependencyResolver container)
    {
        _container = container;
    }

    public IHttpController Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
    {
        var scope = _container.BeginScope();
        var controller = (IHttpController)scope.GetService(controllerType);
        request.RegisterForDispose(scope);
        return controller;
    }
}

//WebApiConfig.cs
public static class WebApiConfig
{
    public static void Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }

    public static void Register(HttpConfiguration config)
    {
        // initialize and map all attribute routed Web API controllers (note: this does not enable MVC attribute routing)
        config.MapHttpAttributeRoutes();
        config.EnsureInitialized();

        //config.Routes.MapHttpRoute(
        //    name: "DefaultApi",
        //    routeTemplate: "api/{controller}/{id}",
        //    defaults: new {id = RouteParameter.Optional});


        // force JSON responses only (no XML)
        config.Formatters.Clear();
        config.Formatters.Add(new JsonMediaTypeFormatter());
    }
}

//Global.asax.cs
public class MvcApplication : Sitecore.Web.Application
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    }

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }
}
如果我添加一个测试ApiController并尝试转到“/api/test”,每次都会得到404。我使用RoutedBugger查看错误,每次都会出现以下错误:

public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }


    public string Get(int id)
    {
        return "value";
    }
我不确定api/sitecore来自哪里。我也按照[WebApi2属性路由与Sitecore][1]帖子上的说明进行了操作,但无法使其正常工作。有人能指出我做错了什么吗?

Sitecore使用/api/作为默认路由URL。 将控制器重命名为ApiController以外的其他名称,或在Global.asax和web.config中更改Sitecore的默认路由
看起来没有注册的路线。WebApiConfig中的唯一路线已被注释掉。

Hey@Ruud van Falier,感谢您的回复。我的控制器名为TestController,它继承了ApicController。我遵循了这个链接的说明。但这对我不起作用。我应该在Global.asax.cs中添加我的自定义路由吗?哪种路由违背了属性路由的目的?我通知了Kam你的问题,也许他能帮上忙。嘿@Ruud van Falier,我可以通过截取此链接中提到的管道来获取WebApi。但现在,常规的sitecore路线似乎不起作用。我添加了一个SitecoreController并试图用api/sitecore/{controller}/{action}/{id}调用它,它给了我一个404;它解析WebApi的属性路由。尽管如此,我还是能够按照此链接中的步骤使其工作。