Saturday 15 January 2011

asp.net mvc 4 - Routing Error with WebApi 2, Castle Windsor, Glass mapper -



asp.net mvc 4 - Routing Error with WebApi 2, Castle Windsor, Glass mapper -

i have setup castle windsor , webapi after reading in below 2 posts. here highlight of setup:

reference posts:

how web api / castle windsor recognize controller? dependency injection in webapi castle windsor

code setup:

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) { homecoming _container.kernel.hascomponent(servicetype) ? _container.resolve(servicetype) : null; } public ienumerable<object> getservices(type servicetype) { homecoming _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 path '{0}' not found.", requestcontext.httpcontext.request.path)); } homecoming (icontroller)_kernel.resolve(controllertype); } } internal class windsorresolver : idependencyresolver, idependencyscope, idisposable { private readonly iwindsorcontainer _container; public windsorresolver(iwindsorcontainer container) { this._container = container; } public idependencyscope beginscope() { homecoming new windsordependencyscope(this._container); } public void dispose() { this._container.dispose(); } public object getservice(type servicetype) { if (!this._container.kernel.hascomponent(servicetype)) homecoming (object)null; else homecoming this._container.resolve(servicetype); } public ienumerable<object> getservices(type servicetype) { if (!this._container.kernel.hascomponent(servicetype)) homecoming (ienumerable<object>)new object[0]; else homecoming 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); homecoming controller; } } //webapiconfig.cs public static class webapiconfig { public static void start() { globalconfiguration.configure(webapiconfig.register); } public static void register(httpconfiguration config) { // initialize , map attribute routed web api controllers (note: not enable mvc attribute routing) config.maphttpattributeroutes(); config.ensureinitialized(); //config.routes.maphttproute( // name: "defaultapi", // routetemplate: "api/{controller}/{id}", // defaults: new {id = routeparameter.optional}); // forcefulness json responses (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); } }

if add together test apicontroller , seek go '/api/test' gives me 404 everytime. used routedebugger view whats wrong , below error everytime:

public ienumerable<string> get() { homecoming new string[] { "value1", "value2" }; } public string get(int id) { homecoming "value"; }

i not sure "api/sitecore" coming from. followed instructions on [webapi2 attribute routing sitecore][1] post unable working. can point me doing wrong?

sitecore using /api/ default route url. rename controller else apicontroller or alter sitecore's default route in global.asax , web.config

asp.net-mvc-4 asp.net-web-api sitecore sitecore7 sitecore7.2

No comments:

Post a Comment