【问题标题】:Web API call returned 404 from DNN siteWeb API 调用从 DNN 站点返回 404
【发布时间】:2017-12-19 13:04:11
【问题描述】:

首先抱歉,如果我在 SO 上错误地问了这个问题。我有一个第三方库 ([Link][1]),其中编写了 Web API 逻辑。我有一个 DNN 自定义模块,我从中显示 PDF 查看器。但是在加载查看器时,我得到了404 异常调用http://dnndev.me/dvapi3/docuvieware3api/init/1

我不确定问题究竟出自 DNN 还是第三方工具。对此问题的任何帮助将不胜感激。

更新

WebAPI 控制器元数据

namespace GdPicture14.WEB
{
public class DocuVieware3ApiController : System.Web.Http.ApiController
{
    public DocuVieware3ApiController();
    [System.Web.Http.ActionNameAttribute("init")]
    [System.Web.Http.HttpPostAttribute]
    public string init([System.Web.Http.FromBodyAttribute] object jsonString);
}
}

RouteMapper.cs

using DotNetNuke.Web.Api;
using GdPicture14.WEB;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http;

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

【问题讨论】:

  • 您的控制器没有从 DnnApiController 或任何其他 DNN 助手继承,所以我看不出这个问题是如何特定于 DNN 的。
  • @Mickers: DocuVieware3ApiController是继承System.Web.Http.ApiController 的第三方控制器,我无法编辑/更新该库。是否所有从 DNN 模块调用的 API 都应该继承 DnnApiController??

标签: c# dotnetnuke


【解决方案1】:

我的VehiDataCollector module 中有一个 DNN 模块中可用的 API 调用示例

您需要提供a route mapper

 public void RegisterRoutes(IMapRoute mapRouteManager)
    {
        mapRouteManager.MapHttpRoute("VehiDataCollector","Default", "{controller}.ashx/{action}",
                                 new[] { "Christoc.Modules.VehiDataCollector.Services" });

        //mapRouteManager.MapHttpRoute("MyServices", "default", "{controller}/{action}", new {"MyServices"});
    }

然后a controller that inherits from DnnApiController 就像@Mickers 在 cmets 中指出的那样

 public class VehiDataCollectorController : DnnApiController
    {
        //URL to get the list of vehicles

        [HttpGet]
        //[DnnAuthorize()]
        //TODO: make it so we can call without ModuleId to get a list of vehicles
        [AllowAnonymous]
        public HttpResponseMessage GetVehicles()
        {
            try
            {
                var mc = new ModuleController();
                var mi = mc.GetModuleByDefinition(0, "VehiDataCollector"); 
//TODO: assuming PortalId=0 if moduleid =0 
                return GetVehicles(mi.ModuleID); 
            }
            catch (Exception exc)
            {
                DnnLog.Error(exc); //todo: obsolete
                return Request.CreateResponse(HttpStatusCode.BadRequest, "Module Not On A Page, or No Vehicles Exist"); //todo: probably should localize that?
            }
        }
    }

【讨论】:

  • 你的意思是我所有的 API 控制器,包括 Dnn 中的第三方库 API 必须继承自 DnnApiController 而不是 System.Web.Http.ApiController ??
  • 也许不是,但你肯定需要使用路由映射器,以便 DNN 知道它的存在。
  • 我的 DNN 自定义模块中已经有 RouteMapper.cs。我已经创建了示例 WebAPI,可以访问 Web API 操作方法,但不能访问第三方库 API 方法。
猜你喜欢
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-22
相关资源
最近更新 更多