2sxc方法App.Data.Create返回System.NullReferenceException

时间:2017-09-28 19:11:53

标签: c# 2sxc

  

版本: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表单调用时,似乎真的发生了。

3 个答案:

答案 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调用,请在开发时考虑此错误。