Asp.net mvc 4 WebApi 2、Castle Windsor、Glass mapper的路由错误
在阅读了下面两篇文章后,我已经安装了Castle Windsor和WebApi。以下是我的设置要点: 参考员额: 代码设置: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
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的属性路由。尽管如此,我还是能够按照此链接中的步骤使其工作。