版本:DNN PLATFORM v.09.01.00(367)/ 2sic 2SexyContent 09.06.00
您好,
对WebAPI App.Data.Create
方法的外部调用似乎不再起作用(它正在使用v9.4)。
我的控制器是:
public class gouvGouvernementController : SxcApiController
{
[HttpPost]
[AllowAnonymous]
public bool Create(organism postOrganisme)
{
var organisme = new Dictionary<string, object>();
organisme.Add("Nom", postOrganisme.Nom.ToString());
organisme.Add("Acronyme", postOrganisme.Acronyme.ToString());
App.Data.Create("Organismes", organisme, "External system");
return true;
}
}
public class organism
{
public string Nom { get; set; }
public string Acronyme { get; set; }
}
我的 ajax 电话(在一个简单的html页面中)
<script>
var vJson = {
"Nom": "Organism",
"Acronyme": "ACRO1"
};
$.ajax({
url:"https://www.mywebsite.net/api/2sxc/app/myapp/api/mycontroller/Create",
data: vJson,
type:"POST",
dataType: 'json',
success: function(donnees) {
console.log(donnees);
}
}
);
</script>
该方法的响应是
{"Message":"Bad Request","ExceptionType":"System.NullReferenceException","ExceptionMessage":"Object reference not set to an instance of an object."}
当我删除行App.Data.Create("Organismes", organisme, "External system");
时,收到响应200,因此问题似乎位于此方法中。
你能告诉我我做错了什么吗?正如我已经说过的那样,代码运行正常,使用2sic_2SexyContent_09.04.03。
感谢您的帮助!
˚F
修改 我只是重新安装版本9.4,我有相同的错误,所以这与2sxc版本无关。
显然,我的代码有问题,所以如果有人可以给我一些建议,我会非常高兴!
EDIT2: 我安装了9.06.01版本(标记为9.06.00),我仍然遇到同样的问题。这是错误堆栈:
at mycontroller.Create(Message postMessage)at lambda_method(Closure,Object,Object [])at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor&LT;&GT; c__DisplayClass10.b__9(对象 instance,Object [] methodParameters)at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(对象 instance,Object [] arguments)at System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext,IDictionary
2 arguments, CancellationToken cancellationToken) --- End of stack trace from previous location where exception was thrown --- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Web.Http.Tracing.ITraceWriterExtensions.d__18
1.MoveNext()--- 从抛出异常的先前位置开始的堆栈跟踪结束 ---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) System.Web.Http.Controllers.ApiControllerActionInvoker.d__0.MoveNext() ---从抛出异常的先前位置开始的堆栈跟踪结束--- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) System.Web.Http.Tracing.ITraceWriterExtensions.d__18`1.MoveNext() --- 从抛出异常的先前位置开始的堆栈跟踪结束 ---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext()) ---从抛出异常的先前位置开始的堆栈跟踪结束--- at System.Web.Http.Filters.ActionFilterAttribute.d__5.MoveNext()---结束 抛出异常的先前位置的堆栈跟踪--- 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 System.Web.Http.Filters.ActionFilterAttribute.d__0.MoveNext()上的任务) ---从抛出异常的先前位置开始的堆栈跟踪结束--- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) System.Web.Http.Controllers.ActionFilterResult.d__2.MoveNext()---结束 抛出异常的先前位置的堆栈跟踪--- 在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) System.Web.Http.Filters.AuthorizationFilterAttribute.d__2.MoveNext() ---从抛出异常的先前位置开始的堆栈跟踪结束--- at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 任务) System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务) System.Web.Http.Controllers.ExceptionFilterResult.d__0.MoveNext()
EDIT3: 我尝试在页面中添加此代码:
<a href="javascript:submitFeedback(@Dnn.Module.ModuleID)">test</a>
<script>
function submitFeedback(mid) {
$2sxc(mid).webApi.post("gouvGouvernement/Create", {}, {
Nom: "Test ministère",
Acronyme: "ACRO 123"
}
).then(function (result) {
alert("Ok");
});
}
</script>
它完美无缺。当我尝试从Ajax表单调用时,似乎真的发生了。
答案 0 :(得分:0)
感谢您提供了一个记录完备的问题。这是正在发生的事情:
对于2sxc来做各种检查,比如安全性等,它需要知道一些上下文,比如应该操作什么应用程序。当您使用/继承SxcApiController时,它将根据module-id(以及查找一堆内容)自动检测此上下文,这通常包含在http请求的标头中。如果您在浏览器上使用F12,您会看到大约有5个标题被添加到webapi调用,ca。 3-4来自DNN,另外1来自2sxc。这是一个例子
ContentBlockId:1199
ModuleId:1199
Debugging-Hint:bootstrapped by 2sxc4ng
TabId:470
RequestVerificationToken:gbqK5UyDGP7ZUqVN...
在你的情况下,你要么不发送这些 - 但我猜你是,因为你正在用$2sxc(mid)
控制器执行你的呼叫。只需查看F12并查看XHR-Requests即可。
在这种情况下,您可能发送的模块ID不是2sxc模块,因此控制器无法查找完成自动检测所需的其余内容。例如,它无法自动检测您当前使用的应用程序。
......但有一种方法:) ......事实上至少有两个
首选的是不完全自动检测应用,但要在网址中包含该名称。您会在此处找到它:https://github.com/2sic/2sxc/wiki/WebApi
我需要进行一些实验,但很可能你只需要替换
$2sxc(mid).webApi.post("gouvGouvernement/Create",
带
$2sxc(mid).webApi.post("app/[your app name]/api/gouvGouvernement/Create",
请在发现时发布最终解决方案:)
答案 1 :(得分:0)
不确定这是否相关,但我在您发布的教程中发现了同样的错误: 1 /安装了“教程 - JavaScript - 使用REST API”教程。 2 /使用“13+ - 使用REST查询简单获取内容项”会给出错误500.在DNN日志中,我将此“对象引用未设置为对象的实例”(参见图片{{ 3}})
但是我的问题不在于GET(我做一个POST)并且我没有链接到Query而是一个Controller,最后,堆栈错误显示了同样的问题。也许你将能够弄清楚你自己的应用程序发生了什么。
非常感谢!
答案 2 :(得分:0)
对于记录,这是开发人员的最终答案:
当2sxc调用web api控制器时,它会向请求添加标头,允许DNN和2sxc识别请求所属的门户,选项卡,模块和应用程序。这是必需的,因为DNN需要验证用户是否具有查看模块的相应权限,并且2sxc必须知道api在哪个上下文中运行(例如,在哪个应用程序中放置应该创建的数据)。
但是当从外部(没有2sxc上下文)调用2sxc api-controller时,请求标头丢失,因此您需要手动指定它们。您可以向请求添加查询字符串参数,而不是使用http标头。
对于您的示例,这将是帖子网址: http://mywebsite.com/api/2sxc/app/myapplication/api/mycontroller/Create?moduleid=123&tabid=12
如果其他人正在使用api调用,请在开发时考虑此错误。