0

这是我遵循的 DnnApiController 文档

http://www.dotnetnuke.com/Resources/Blogs/EntryId/3541/WebAPI-Tips.aspx

不幸的是,文档没有解释如何将类库集成到 Dnn 中。该文档似乎表明可以浏览在本地 IIS 上配置的 Dnn 解决方案,例如

http://dotnetnuke/DesktopModules/MyServices/API/RoleSubScription/GetPublicRoles

其中 RoleSubscription 是 RoleSubscriptionController 而 GetPublicRoles 是 GET 方法。

我已经通过 Fiddler 调试了一个 Web API 控制器方法,但是我使用了 MVC 4 Wep API 项目并且它运行良好,我能够使用 IIS express 和 Fiddler composer 使用 IIS express Url 对其进行调试。

正如我所看到的,有几个选项可以调试我创建的这个 DnnApiController

  1. 尝试运行类库项目本身 - 这需要将类库项目转换为某种 Web 应用程序项目。

  2. 创建一个 MVC 4 Web API 项目并按照 Dnn web api 提示中的建议添加适当的程序集和配置 = 这看起来是最好的选择,也是我可能首先尝试的选择。

  3. 在最新版本的 Dnn 的本地 IIS 安装中,将我创建的类添加到 DestktopModules 下的文件夹结构中 - 这不适用于 IIS express。

  4. 如果我想使用 IIS express,我可以将类添加到我的文件系统版本 Dnn 中的桌面模块下的文件夹结构中 - 这可能有效。

4

2 回答 2

1

我得到它的工作,谢谢。上面链接中的方法确实有效。我使用了一个类库并将构建目标指向 DNN 的主 bin 文件夹。我以两种方式对其进行了调试,首先使用示例中建议的 URL 结构,然后我向 DNN 添加了一个模块,并使用 jQuery .ajax 调用访问了 Web API 方法。我使用 Newtonsoft.Json 将 DnnContent 对象转换为 json。

这是 DnnApiController 类

using System.Net;
using System.Net.Http;
using System.Web.Http;
using DotNetNuke.Web.Api;
using Newtonsoft.Json;

namespace DnnModule
{
    public class DnnContentController : DnnApiController
    {
        private IDnnContentRepository _dbRepository;
        public DnnContentController()
        {
            _dbRepository = new DnnContentRepository();

        }

        [AllowAnonymous]
        [HttpGet]
        public HttpResponseMessage GetContent(int id)
        {
            if (id != 0)
            {
                var dnnContent = new DnnContent
                {
                    Content = _dbRepository.GetContent(id),
                    Title = _dbRepository.GetTitle(id)
                };
                return Request.CreateResponse(HttpStatusCode.OK, JsonConvert.SerializeObject(dnnContent));
            }
            return Request.CreateResponse(HttpStatusCode.BadRequest, JsonConvert.SerializeObject(string.Empty));
        }
    }
}


public class DnnContent
{
    public string Content { get; set; }
    public string Title { get; set; }
}

这是 Dnn 模块用户控件的 UI 代码

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="DnnContentViewer.ascx.cs" Inherits="DnnModule.DnnContentViewer" %>

<h2>IngenMobile DNN Content Viewer</h2>

<script type="text/javascript">
    $(document).ready(function () {
        $("#getDnn").click(function () {
            var id = $("#id").val();
            GetDnnContent(id);
        });
    });
    function GetDnnContent(moduleId) {
        jQuery.support.cors = true;

        $.ajax({
            url: 'DesktopModules/DnnModule/api/DnnContent/GetContent?id=' + id,
            type: 'GET',

            dataType: 'json',
            success: function (data) {
                var obj = $.parseJSON(data);
                $('#result').html("Title: " + obj.Title + "</br>" + "Content: " + htmlDecode(obj.Content));
            },
            error: function (request, status, error) {
                $('#result').html('Error: ' + request.statusText);
            }
        });
    }
    function htmlDecode(value) {
        if (value) {
            return $('<div />').html(value).text();
        } else {
            return '';
        }
    }
</script>
Enter id: <input type="text" id="id" value="" />
<input id="getDnn" type="button" value="Submit" />
<hr/>
<div id="result"></div>

我确实遇到了未找到响应的问题。问题是我使用了带有“。”的模块名称。在里面。当我拿了'。在模块名称之外,它起作用了。

于 2013-04-11T18:04:25.323 回答
-1

查看这个 HelloWorld 示例,看看它是否对您有任何帮助。

DotNetNuke WebAPI HelloWorld 示例 - 第一部分

于 2013-04-10T21:48:00.580 回答