Asp.net web api 如何使用Fiddler调试DnnApiController?

Asp.net web api 如何使用Fiddler调试DnnApiController?,asp.net-web-api,dotnetnuke,Asp.net Web Api,Dotnetnuke,这是DnnApiController文档,我严格遵循了它 不幸的是,文档没有解释如何将类库集成到Dnn中。文档似乎表明可以浏览在本地IIS上配置的Dnn解决方案,例如 http://dotnetnuke/DesktopModules/MyServices/API/RoleSubScription/GetPublicRoles 其中RoleSubscription是RoleSubscriptionController,GetPublicRoles是GET方法 我已经通过Fiddler调试了一个

这是DnnApiController文档,我严格遵循了它

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

http://dotnetnuke/DesktopModules/MyServices/API/RoleSubScription/GetPublicRoles
其中RoleSubscription是RoleSubscriptionController,GetPublicRoles是GET方法

我已经通过Fiddler调试了一个Web API控制器方法,但是我使用了MVC4 Wep API项目,它工作得非常完美,我能够使用IIS express和Fiddler composer使用IIS express Url进行调试

在我看来,有几个选项可以调试我创建的DnnApiController

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

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

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

  • 如果我想使用IIS express,我可以在我的Dnn文件系统版本中将类添加到桌面模块下的文件夹结构中-这可能会起作用


  • 看看这个HelloWorld示例,看看它是否对您有所帮助


    我让它工作了,谢谢。上面链接中的方法确实有效。我使用了一个类库,并将构建目标指向DNN的主bin文件夹。我用两种方式调试它,首先使用示例中建议的URL结构,然后向DNN添加一个模块,并使用jQuery.ajax调用访问WebAPI方法。我使用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>
    
    
    IngenMobile DNN内容查看器
    $(文档).ready(函数(){
    $(“#getDnn”)。单击(函数(){
    var id=$(“#id”).val();
    GetDnnContent(id);
    });
    });
    函数GetDnnContent(moduleId){
    jQuery.support.cors=true;
    $.ajax({
    url:'DesktopModules/DnnModule/api/DnnContent/GetContent?id='+id,
    键入:“GET”,
    数据类型:“json”,
    成功:功能(数据){
    var obj=$.parseJSON(数据);
    $('#result').html(“标题:+obj.Title+”
    “+”内容:+htmlDecode(obj.Content)); }, 错误:功能(请求、状态、错误){ $('#result').html('错误:'+request.statusText); } }); } 函数htmlDecode(值){ 如果(值){ 返回$('').html(value.text(); }否则{ 返回“”; } } 输入id:

    我确实遇到了一个问题,没有找到响应。问题是我使用了一个模块名,其中有一个“.”。当我从模块名中去掉“.”时,它起作用了

    当您浏览到GetPublicRoles方法时,它会给您带来什么错误?您需要将该类添加到DotNetNuke安装中的(bin)文件夹中。您应该尝试返回对象本身,而不是返回JSON字符串。然后让客户机能够指定如何序列化它(即序列化不再是控制器的问题,而是由框架负责)。