【问题标题】:Is this a bug? Or, how do I debug a 2sxc ApiController?这是一个错误吗?或者,如何调试 2sxc ApiController?
【发布时间】:2020-09-25 01:29:42
【问题描述】:

我有一个名为 chv01 的 2sxc 应用程序, 用几个字段创建了一个名为 Location 的 Content-Type, 创建了一个名为 Portals/0/2sxc/chv01/api 的文件夹, 已添加LocationsController.cs 看起来像这样:

    using DotNetNuke.Web.Api;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net.Http;
    using System.Web.Http;
    public class locationsController : ToSic.Sxc.Dnn.ApiController
    {
      [HttpGet]
      [AllowAnonymous]
      public object Location()
      {
        return new ToSic.Sxc.Conversion.DataToDictionary(Edit.Enabled)
          .Convert(App.Data["Location"]);
      }
    }

我已经对 Content-Type 设置了权限,因此 .Anonymous 可以读取。以上所有内容均来自阅读此内容 https://docs.2sxc.org/how-to/webapi/dotnet-webapi.html
使用 DNN 9.07.02、2sxc 11.06.01 我的网址是 api/2sxc/app/chv01/api/locations/Location 这给了我这个错误:

{
  "Message": "An error has occurred.",
  "ExceptionMessage": "Object reference not set to an instance of an object.",
  "ExceptionType": "System.NullReferenceException",
  "StackTrace": "   
at ToSic.Sxc.Dnn.Code.DnnDynamicCode.Init(IBlock block, ILog parentLog, Int32 compatibility) 
in C:\\Projects\\2sxc\\2sxc\\Src\\Dnn\\ToSic.Sxc.Dnn\\Dnn\\Code\\DnnDynamicCode.cs:line 22\r\n   
at ToSic.SexyContent.WebApi.DynamicApiController.Initialize(HttpControllerContext controllerContext) 
in C:\\Projects\\2sxc\\2sxc\\Src\\Dnn\\ToSic.Sxc.Dnn.WebApi\\WebApi\\DynamicApiController.cs:line 43\r\n   
at System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)\r\n   
at System.Web.Http.Tracing.Tracers.HttpControllerTracer.<ExecuteAsyncCore>d__5.MoveNext()\r\n
--- End of stack trace from previous location where exception was thrown ---\r\n 
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   
at System.Web.Http.Tracing.ITraceWriterExtensions.<TraceBeginEndAsyncCore>d__18`1.MoveNext()\r\n
--- End of stack trace from previous location where exception was thrown ---\r\n 
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n   
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n   
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()"
}

如果我将网址更改为api/2sxc/app/chv01/api/NOTlocations/Location 正如预期的那样,我得到了这个:

<Error>
<Message>2sxc Api Controller Finder: Controller NOTlocationsController not found in app.</Message>
</Error>

所以我的问题是:

  1. 如何调试?
  2. 有人有工作示例吗?
  3. 对我错过的步骤或细节有什么建议吗?
  4. 也许我发现了一个错误?

【问题讨论】:

    标签: c# asp.net-web-api dotnetnuke 2sxc asp.net-apicontroller


    【解决方案1】:

    首先,您的问题几乎可以肯定是这样的:由于您使用的是[HttpGet],您可能认为您可以在浏览器中调用该 url 看看会发生什么。

    现在,DNN 在内部发挥了一些作用,因此 API 知道您在哪个页面/模块上,这需要 HTTP 中的一些标头。如果您使用 javascript 调用端点,您要么必须自己添加这些标头,要么使用 $2sxc(...) 助手来使其工作。您可以在此应用中找到示例:https://2sxc.org/en/apps/app/tutorial-javascript-rest-api-using-jquery-and-angularjs

    这只是为了帮助您解决问题。

    要调试,您有两个选择

    1. 使用 2sxc 洞察力 - 并使用 Log 对象
    2. 将 Visual Studio 连接到 DNN 并进行实时调试

    有意义吗?

    【讨论】:

    • 太好了,我已经取得了进步,现在 Postman 中的内容已经按预期出现了,谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-18
    • 2012-03-25
    • 2010-12-22
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多