First, I think you may have a misunderstanding of the routing. It looks like you are using the namespace name in your url. Unless your module is called 'NewController', your url would not work. DNN routing is very similar to Web Api routing except that you have to specify the module folder name
as such /DesktopModules/<moduleFolderName>/API/
. So if you have a module called 'MyModule'
and your controller is in a namespace called 'NewController'
, the address would be
'http://localhost/dnn7/DesktopModules/MyModule/API/NewInfo/HelloWorld'
The default route would then look like this;
mapRouteManager.MapHttpRoute(
"MyModule",
"default",
"{controller}/{action}",
new[] { "NewController" });
which can also be rewritten with named parameters as such
mapRouteManager.MapHttpRoute(
moduleFolderName: "MyModule",
routeName: "default",
url: "{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional },
namespaces: new[] { "NewController" }
);
See this link for more info
Regarding your second part, can you have multiple routes? Of course;
Say your controller has the following actions
namespace NewController
{
public class NewInfoController : DnnApiController
{
[AllowAnonymous]
[HttpGet]
public HttpResponseMessage HelloWorld()
{
return Request.CreateResponse(HttpStatusCode.OK, "Hello World!");
}
[HttpGet]
public HttpResponseMessage GetItemByName(string name)
{
//your logic here
}
[HttpGet]
public HttpResponseMessage GetItemByNameAndLocation(string name, string location)
{
//your logic here
}
}
}
then your routing class would look like this
namespace NewController
{
public class RouteMapper : IServiceRouteMapper
{
public void RegisterRoutes(IMapRoute mapRouteManager)
{
mapRouteManager.MapHttpRoute(
moduleFolderName: "MyModule",
routeName: "itemByName",
url: "{controller}/{action}/{name}",
defaults: new { name = "" },
namespaces: new[] { "NewController" }
);
mapRouteManager.MapHttpRoute(
moduleFolderName: "MyModule",
routeName: "itemByNameAndLocation",
url: "{controller}/{action}/{name}/{location}",
defaults: new { name = "", location = "" },
namespaces: new[] { "NewController" }
);
mapRouteManager.MapHttpRoute(
moduleFolderName: "MyModule",
routeName: "default",
url: "{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional },
namespaces: new[] { "NewController" }
);
}
}
}
Now http://localhost/dnn7/DesktopModules/MyModule/API/NewInfo/GetItemByName/someName
will be handled by the first route, http://localhost/dnn7/DesktopModules/MyModule/API/NewInfo/GetItemByNameAndLocation/someName/someLocation
will be handled by the second route. Anything that doesn't match those two will be handled by the last default
route. Remember hierarchy in routing is important!
What if you want to shorten the urls to say
http://localhost/dnn7/DesktopModules/MyModule/API/fetch/someName
and
http://localhost/dnn7/DesktopModules/MyModule/API/fetchByNameAndLocation/someName/someLocation
Notice we didn't specify the Controller
and the Action
. All we have to do is change the first two routes to
mapRouteManager.MapHttpRoute(
moduleFolderName: "MyModule",
routeName: "itemByName",
url: "fetch/{name}",
defaults: new { controller = "NewInfo", action = "GetItemByName", name = "" },
namespaces: new[] { "NewController" }
);
mapRouteManager.MapHttpRoute(
moduleFolderName: "MyModule",
routeName: "itemByNameAndLocation",
url: "fetchByNameAndLocation/{name}/{location}",
defaults: new { controller = "NewInfo", action = "GetItemByNameAndLocation", name = "", location = "" },
namespaces: new[] { "NewController" }
);
If you are familiar with Web Api, you'll notice DNN's services routing is very similar since it's just a wrapper around the underlying Web Api's routing. Good luck!