DNN не может получить доступ к методу POST в контроллере API DNN - PullRequest
0 голосов
/ 24 января 2020

Мой метод GET РАБОТАЕТ нормально, когда я использую URL, зарегистрированный как SuperUser, как это (я получаю имя первого пользователя, извлеченного из БД):

http://localhost/DesktopModules/AAAA_MyChatServer/API/ChatApi/GetMessage

Но я не могу получить доступ к методу POST в том же контроллере, используя AJAX из представления или просто введя URL (метод post не получает попадание / найдено) :

http://localhost/DesktopModules/AAAA_MyChatServer/API/ChatApi/SendMessage

И это также не работает:

$('#sendChat').click(function (e) {
                    e.preventDefault();

                    var user = '@Model.CurrentUserInfo.DisplayName';
                    var message = $('#chatBoxReplyArea').val();
                    var url = '/DesktopModules/AAAA_MyChatServer/API/ChatApi/SendMessage';

                    $.post(url, { user: user, message: message }, function (data) {
                    }).done(function () {


                    });
                });

Сообщение об ошибке:

<Error>
<Message>
No HTTP resource was found that matches the request URI 'http://localhost/DesktopModules/AAAA_MyChatServer/API/ChatApi/SendMessage'.
</Message>
<MessageDetail>
No action was found on the controller 'ChatApi' that matches the name 'SendMessage'.
</MessageDetail>
</Error>

И иногда:

"Контроллер не поддерживает метод GET"

, хотя у меня есть и GET, и POST и ПОЛУЧИТЬ работает. Чего мне не хватает?

Я создал класс маршрутизации в своем проекте DNN:

using DotNetNuke.Web.Api;

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

        }
    }
}

Я добавил контроллер Api DNN в папку Services моего проекта с именем AAAA.MyChatServer:

using DotNetNuke.Web.Api;
using System.Linq;
using System.Net.Http;
using System.Web.Http;

namespace AAAA.MyChatServer.Services
{
    [DnnAuthorize(StaticRoles = "SuperUser")]
    public class ChatApiController : DnnApiController
    {
        [HttpGet]           
        public HttpResponseMessage GetMessage()
        {
            ChatServerManager csm = new ChatServerManager();

            var users = csm.GetAllUsers();

            var user = users.FirstOrDefault().Name;
            return Request.CreateResponse(System.Net.HttpStatusCode.OK, user);
        }


        [System.Web.Http.HttpPost]
        public HttpResponseMessage SendMessage(string toUser, string message)
        {
            return Request.CreateResponse(System.Net.HttpStatusCode.OK);
        }
    }
}

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Существует два способа вызова метода POST в DNAP WebAPI: с параметрами и с объектом. Если вы используете параметры, как в вашем методе SendMessage, эти значения параметров должны быть доставлены через строку запроса.

С другой стороны, создание объекта и отправка его с помощью вашего вызова в метод WebAPI может обработать гораздо больше сценариев ios и, возможно, является лучшим способом обработки любого метода POST (поскольку он скрывает значения от любопытных глаз, что делает вызов более сложным для подделки). Чтобы справиться с этим, вы можете удалить параметры из вашего метода SendMessage и вместо этого опросить объект HttpContext.Current.Request в вашем методе. Созданный вами объект { user: user, message: message } будет где-то укрыт.

Как написано в вашем примере, ваш объект проплывал мимо ваших параметров, как два корабля ночью.

I ' Я только что понял это сам, и у меня пока нет всего понимания, в котором я нуждаюсь, но, надеюсь, это поможет вам на вашем пути. Вот несколько статей, на которые я ссылался в своем стремлении использовать cURL для загрузки файла в мой DNN WebAPI:

Удачи!

1 голос
/ 26 января 2020

Ваш Web Api для SendMessage содержит 2 параметра, поэтому он должен POST в строке запроса: http://localhost/DesktopModules/AAAA_MyChatServer/API/ChatApi/SendMessage?touser=john&message=hello

, если вы хотите POST его, используя данные объекта, вам нужно сделать параметр веб-службы в качестве объектной модели

Также ваш параметр javascript отличается от веб-службы, так как в нем используется «toUser»

...