这是一个错误吗?或者,如何调试 2sxc ApiController?
Is this a bug? Or, how do I debug a 2sxc ApiController?
我有一个名为 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
我的 URL 是 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()"
}
如果我将 url 更改为 api/2sxc/app/chv01/api/NOTlocations/Location
不出所料,我得到了这个:
<Error>
<Message>2sxc Api Controller Finder: Controller NOTlocationsController not found in app.</Message>
</Error>
所以我的问题是:
- 我该如何调试?
- 有人有工作示例吗?
- 对我遗漏的步骤或细节有什么建议吗?
- 也许我发现了一个错误?
所以首先,您的问题几乎可以肯定是这样的:因为您使用的是 [HttpGet]
,您可能认为您可以在浏览器中调用 url,看看会发生什么。
现在 DNN 在内部做了一些魔术,所以 API 知道你在做什么 page/module,这需要 HTTP 中的一些 headers。如果您使用 javascript 调用端点,您要么必须自己添加这些 headers,要么使用 sxc(...)
助手来使其工作。您可以在此应用程序中找到示例:https://2sxc.org/en/apps/app/tutorial-javascript-rest-api-using-jquery-and-angularjs
这只是为了帮助您解决问题。
要进行调试,您有两种选择
- 使用 2sxc 见解 - 并使用 Log objects
- 将 visual studio 附加到 DNN 并实时调试
有道理吗?
我有一个名为 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
我的 URL 是 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()"
}
如果我将 url 更改为 api/2sxc/app/chv01/api/NOTlocations/Location
不出所料,我得到了这个:
<Error>
<Message>2sxc Api Controller Finder: Controller NOTlocationsController not found in app.</Message>
</Error>
所以我的问题是:
- 我该如何调试?
- 有人有工作示例吗?
- 对我遗漏的步骤或细节有什么建议吗?
- 也许我发现了一个错误?
所以首先,您的问题几乎可以肯定是这样的:因为您使用的是 [HttpGet]
,您可能认为您可以在浏览器中调用 url,看看会发生什么。
现在 DNN 在内部做了一些魔术,所以 API 知道你在做什么 page/module,这需要 HTTP 中的一些 headers。如果您使用 javascript 调用端点,您要么必须自己添加这些 headers,要么使用 sxc(...)
助手来使其工作。您可以在此应用程序中找到示例:https://2sxc.org/en/apps/app/tutorial-javascript-rest-api-using-jquery-and-angularjs
这只是为了帮助您解决问题。
要进行调试,您有两种选择
- 使用 2sxc 见解 - 并使用 Log objects
- 将 visual studio 附加到 DNN 并实时调试
有道理吗?