【问题标题】:DNN Cannot access POST method in DNN Api ControllerDNN 无法访问 DNN Api 控制器中的 POST 方法
【发布时间】:2020-01-24 05:03:59
【问题描述】:

当我使用像这样以超级用户身份登录的 url 时,我的 GET 方法 WORKS 很好(我得到了从数据库中提取的第一个用户的名称):

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

但我无法使用 AJAX 从视图或仅通过输入 url 访问同一控制器中的 POST 方法(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 并且 GET 工作。我错过了什么?

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

        }
    }
}

我在名为 AAAA.MyChatServer 的项目的文件夹 Services 中添加了一个 DNN Api 控制器:

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

【问题讨论】:

    标签: asp.net-mvc asp.net-web-api asp.net-mvc-routing dotnetnuke


    【解决方案1】:

    在 DNN WebAPI 中调用 POST 方法有两种方法:使用参数和使用对象。如果您使用参数,就像您在 SendMessage 方法中使用的那样,这些参数值需要通过查询字符串传递。

    另一方面,创建一个对象并通过调用 WebAPI 方法发送它可以处理更多的场景,并且可以说是处理任何 POST 方法的更好方法(因为它隐藏了这些值不被窥探,使得电话更难伪造)。要处理此问题,您可以从 SendMessage 方法中删除参数,而是在您的方法中询问 HttpContext.Current.Request 对象。您创建的对象{ user: user, message: message } 将被放置在某处。

    正如您的示例中所写,您的对象在夜间航行超过您的参数,就像两艘船一样。

    我自己只是想通了这一点,我还没有完全了解我需要的知识,但希望这对你有所帮助。以下是我在寻求使用 cURL 将文件上传到我的 DNN WebAPI 时引用的一些文章:

    祝你好运!

    【讨论】:

      【解决方案2】:

      您的 SendMessage 的 Web Api 包含 2 个参数,因此它应该在查询字符串中发布: http://localhost/DesktopModules/AAAA_MyChatServer/API/ChatApi/SendMessage?touser=john&message=hello

      如果要使用对象的数据进行POST,则需要将Web Service参数设为对象模型

      此外,您的 javascript 参数与 Web 服务不同,因为它使用“toUser”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 2018-03-18
        • 1970-01-01
        相关资源
        最近更新 更多