通过Ajax传递JSON字符串的ASP.net在本地工作,但不能在Windows Azure服务器上运行

时间:2014-02-20 14:42:19

标签: c# asp.net ajax json azure

我的项目的主要问题是,我的代码不能与Windows Azure Server一起使用,但它可以在本地运行。我一直在寻找两天,我和两天前一样困惑。但是,让我们看看你们如何处理这个问题。

首先我的JavaScript代码:

    $("#btnsave").click(function () {

    var prot = [];

    for (var i = 1; i <= zeilencounter; i++) {
        var val = { "Zeit": String($("#protokoll_" + i + "_zeit").val()), "Protokolltext": $("#protokoll_" + i + "_text").val(), "Erledigt": $("#protokoll_" + i + "_check").prop("checked") };

    prot.push(val);

    }
    var protokoll = { "Protokoll": JSON.stringify(prot) };

    $.ajax({
        type: "POST",
        url: '/operation/ErstelleProtokoll/',
        cache: false,
        data: protokoll,
        dataType: 'html',
        success: function (result) {
            hidePopups();
            SaveInfo();
            window.location.assign('http://firepad.blob.core.windows.net/einsatzprotokoll/einsatzprotokoll.pdf');
        }
    });

你看它并不复杂。我唯一要做的就是从我的协议表单中收集数据。

通过Ajax调用,我想将收集的数据传递给我的ASP.net代码。

ASP.net代码:

public void ErstelleProtokoll(string protokoll)
    {
        Formulare_Einsatzprotokoll[] Einsatzprotokoll = JsonConvert.DeserializeObject<Formulare_Einsatzprotokoll[]>(protokoll);

        new FirePad.Services.Einsatzprotokoll(Einsatzprotokoll);
    }

我的“Formulare_Einsatprotokoll”课程应该很简单:

public class Formulare_Einsatzprotokoll
{
    public string Zeit { get; set; }
    public string Protokolltext { get; set; }
    public bool Erledigt { get; set; }

    public Formulare_Einsatzprotokoll()
    {

    }
}

(我有一个构造函数,因为我在网上的某处读过,这可能会解决我的问题。)

我的程序运行正常,直到我将其上传到我的Windows Azure平台。突然它决定我的代码是错误的,并给我以下错误信息:

Value cannot be null.
Parameter name: value

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.ArgumentNullException: Value cannot be null.
Parameter name: value

Source Error: 

An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below.

Stack Trace: 


[ArgumentNullException: Value cannot be null.
Parameter name: value]
   Newtonsoft.Json.JsonConvert.DeserializeObject(String value, Type type, JsonSerializerSettings settings) +161
   Newtonsoft.Json.JsonConvert.DeserializeObject(String value, JsonSerializerSettings settings) +66
   firepad.Controllers.OperationController.ErstelleProtokoll(String protokoll) +206
   lambda_method(Closure , ControllerBase , Object[] ) +104
   System.Web.Mvc.<>c__DisplayClass1.<WrapVoidAction>b__0(ControllerBase controller, Object[] parameters) +14
   System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +14
   System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +182
   System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
   System.Web.Mvc.Async.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41() +28
   System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethod(IAsyncResult asyncResult) +32
   System.Web.Mvc.Async.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33() +58
   System.Web.Mvc.Async.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() +225
   System.Web.Mvc.Async.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) +10
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeActionMethodWithFilters(IAsyncResult asyncResult) +34
   System.Web.Mvc.Async.<>c__DisplayClass2a.<BeginInvokeAction>b__20() +24
   System.Web.Mvc.Async.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) +99
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +50
   System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27
   System.Web.Mvc.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) +14
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
   System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +39
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
   System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +29
   System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10
   System.Web.Mvc.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) +25
   System.Web.Mvc.Async.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) +23
   System.Web.Mvc.Async.WrappedAsyncResult`1.End() +55
   System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +31
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9515512
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

(我会将其作为图片发布,但stackoverflow不允许我发布图片,直到我获得至少10个声誉。)

在服务器上看来,我的Ajax没有将数据传递给ASP.net,所以我的字符串为null。但为什么?为什么它在本地工作但不在服务器上工作?

1 个答案:

答案 0 :(得分:1)

如果有人需要这个:这是你的解决方案。

首先:我的问题既不是JSON也不是Ajax。当我在开发者控制台中的谷歌浏览器上收到我的错误消息时,我总是按照错误链接。在我的情况下“firepad.azurewebsites.net/operation/ErstelleProtokoll”。但是当我调用这个URL时,我回想起了带有空值的JSON.Deserizalize函数:当然,因为在调用中没有传递值。

所以我开始重新思考我的问题,并且通过以下方式得出错误:

new FirePad.Services.Einsatzprotokoll(Einsatzprotokoll);

我在代码中评论了以下几行:

Formulare_Einsatzprotokoll[] Einsatzprotokoll = JsonConvert.DeserializeObject<Formulare_Einsatzprotokoll[]>(protokoll);

我将此版本上传到服务器后,我发现Azure服务器上由于根符号(“〜”)而导致路径异常。所以我开始使用MemoryStream类解决这个异常。经过几次尝试后,我找到了解决问题的正确方法。

所以我重复使用了:

Formulare_Einsatzprotokoll[] Einsatzprotokoll = JsonConvert.DeserializeObject<Formulare_Einsatzprotokoll[]>(protokoll);

并且再也没有出现过错误。你应该看到我的脸 - 这非常棒。

因为它是如此美丽的故事 - 总结起来:

我的问题不是Ajax调用,而是反序列化后的代码行。这条线引起了这个问题,因为我从一位有“工作保证”的同事那里得到了这个代码,我从未尝试过这种方式。所以信任并不总是有用的:D

非常感谢这个伟大的论坛,因为此处的问题解决了我之前的大部分错误。