Есть ли возможность добавить несколько маршрутов в карту маршрутов DNN?

Я реализовал модуль, в котором я разделил его на две части:

  1. Веб-проект:
    в котором мои страницы пользовательского интерфейса в виде вызовов ascx и ajax запускают мой веб-API и получают от него данные.
  2. Библиотека классов:
    в которой есть мои контроллеры API и класс сопоставления маршрутов. ВСЕ работает нормально, но браузер обработал ошибку «404». Это означает, что URL-адрес не найден. Я запутался, где я сделал ошибку.

Вот мой класс Router Mapper: -

using DotNetNuke.Web.Api;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI.WebControls;

namespace NewController 
{
   public class RouteMapper : IServiceRouteMapper
    {
        public void RegisterRoutes(IMapRoute mapRouteManager)
        {
            mapRouteManager.MapHttpRoute("NewController", "default", "{controller}/{action}",
                new[] { "NewController" });
        }
    }
}

Я также много раз проверял свое пространство имен и имя папки, но не нашел там никакой ошибки.

My Controller namespace is like below:-
using DotNetNuke.Common.Utilities;
using DotNetNuke.Web.Api;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;

namespace NewController
{
    public class NewInfoController : DnnApiController
    {
        [AllowAnonymous]
        [HttpGet]
        public HttpResponseMessage HelloWorld()
        {
            return Request.CreateResponse(HttpStatusCode.OK, "Hello World!");
        }
    }
}

Правильное получение URL, а также: curl 'http://localhost/dnn7/DesktopModules/NewController/API/NewInfo/HelloWorld'

Or

Проблема в том, что у меня несколько контроллеров API? Нужно ли настраивать несколько маршрутов? Если да, то как?


person Shian JA    schedule 29.07.2015    source источник
comment
Я пытаюсь понять вашу проблему. Вы получаете ошибку 404 при попытке протестировать свою службу с помощью браузера с localhost/dnn7 /DesktopModules/NewController/API/NewInfo/? Если да, то встроена ли библиотека DLL вашей библиотеки классов в папку /bin DNN?   -  person DotNetNuclear    schedule 29.07.2015


Ответы (1)


Во-первых, я думаю, у вас может быть неправильное понимание маршрутизации. Похоже, вы используете имя пространства имен в своем URL-адресе. Если ваш модуль не называется «NewController», ваш URL-адрес не будет работать. Маршрутизация DNN очень похожа на маршрутизацию веб-API, за исключением того, что вы должны указать имя папки модуля как таковое /DesktopModules/<moduleFolderName>/API/. Итак, если у вас есть модуль с именем 'MyModule', а ваш контроллер находится в пространстве имен с именем 'NewController', адрес будет

'http://localhost/dnn7/DesktopModules/MyModule/API/NewInfo/HelloWorld'

Тогда маршрут по умолчанию будет выглядеть следующим образом;

mapRouteManager.MapHttpRoute(
   "MyModule", 
   "default",
   "{controller}/{action}",
   new[] { "NewController" });

который также можно переписать с именованными параметрами как таковыми

mapRouteManager.MapHttpRoute(
   moduleFolderName: "MyModule",
   routeName: "default",
   url: "{controller}/{action}/{id}",
   defaults: new { id = RouteParameter.Optional },
   namespaces: new[] { "NewController" }
   );

См. эту ссылку для получения дополнительной информации.

Что касается вашей второй части, у вас может быть несколько маршрутов? Конечно;

Скажем, ваш контроллер имеет следующие действия

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
        }
    }
}

тогда ваш класс маршрутизации будет выглядеть так

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" }
            );
        }
    }
}

Теперь http://localhost/dnn7/DesktopModules/MyModule/API/NewInfo/GetItemByName/someName будет обрабатываться первым маршрутом, http://localhost/dnn7/DesktopModules/MyModule/API/NewInfo/GetItemByNameAndLocation/someName/someLocation будет обрабатываться вторым маршрутом. Все, что не соответствует этим двум, будет обрабатываться последним маршрутом default. Помните, что иерархия в маршрутизации важна!

Что делать, если вы хотите сократить URL-адреса, чтобы сказать

http://localhost/dnn7/DesktopModules/MyModule/API/fetch/someName

и

http://localhost/dnn7/DesktopModules/MyModule/API/fetchByNameAndLocation/someName/someLocation

Обратите внимание, что мы не указали Controller и Action. Все, что нам нужно сделать, это изменить первые два маршрута на

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" }
);

Если вы знакомы с Web Api, вы заметите, что маршрутизация сервисов DNN очень похожа, поскольку это просто оболочка вокруг маршрутизации базового Web Api. Удачи!

person Moses Machua    schedule 02.08.2015