2012-08-09 52 views
0

我正在編寫一個ASP.NET Web應用程序,在客戶端和服務器之間傳輸JSON。我幾乎樣樣齊全,但我似乎無法從客戶端的JSON到ASMX傳輸並將其解釋爲任何東西,但Dictionary<string>無法發送JSON到ASMX除了字典<>

在服務器端,我有

[WebService(Namespace = "http://tempuri.org/")] 
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
[ToolboxItem(false)] 
[ScriptService] 
public class WebService1: System.Web.Services.WebService 
{ 
    [WebMethod(EnableSession = true)] 
    public bool SaveExpression(ExpressionStructure Expression) { 
     return true; 
    } 
} 

在客戶機側,我送使用$.ajax(),其中expressionObject.expression是.NET類ExpressionStructure的目的較早接收由所述客戶端的數據:

var dataSubmit = { Expression: expressionObject.expression }; 
$.ajax({ 
    url: "WebService.asmx/SaveExpression", 
    contentType: "application/json; charset=utf-8", 
    dataType: "json", 
    type: 'POST', 
    data: JSON.stringify(dataSubmit), 
    success: function (msg) { 
     alert(msg.d); 
    }, 
    error: function (obj, status, msg) { ajaxServerError(obj, status, msg); } 
}); 

SaveExpression甲基od接受Object,我得到一個字符串字典。當我使用ExpressionStructure時,我得到500 Internal Server Error

要發送的表達式是從此MVC3控制器方法接收到的未修改版本。

public ActionResult Expression(int ExpressionID) { 
    ExpressionStructure es = GetExpressionFromDatabase(ExpressionID); 

    return new JsonResult { 
     Data = new { 
      expression = es, 
      view = this.RenderPartialView("_Expression_Statement", es) 
     }, 
     JsonRequestBehavior = System.Web.Mvc.JsonRequestBehavior.AllowGet 
    }; 
} 

本身看起來像這樣的表達:

{ 
    "Expression": 
    { 
     "Name":"Status Desc", 
     "Type":0, 
     "Statement": 
     { 
      "FormulaItem": 
      { 
       "Type":"Replace", 
       "Parameters": 
       [ 
        { 
         "Type":"Char", 
         "Value": 
         { 
          "Value":"[Status]" 
         }, 
         "Source":"picker" 
        }, 
        { 
         "Type":"input", 
         "Value": 
         { 
          "Value":"0,1,2;Home,Driving,Away" 
         }, 
         "Source":"inputBox" 
        } 
       ] 
      } 
     } 
    } 
} 

我試圖改變ASMX方法採取stringExpressionStructure但都返回一個500 Internal Server Error。我也嘗試修改來自客戶端的JSON,做各種包裝(包括用方括號包裹最外面的"Expression")。

我錯過了什麼關鍵元素,阻止了ASMX正確使用JSON並獲得ExpressionStructure(可選)如何直接或從字典中獲取字符串,以便我可以手動執行JSON轉換(我寧願不這樣做)?

+0

如果在從本地主機訪問Web服務時使用像提琴手這樣的工具來跟蹤網絡流量,是否會得到擴展錯誤信息? – Hans 2012-08-09 19:40:21

回答

0

在建立一個與主項目分離的小測試用例之後,我能夠獲得有關服務器返回原因的更好信息500 Internal Server Error。碰巧,Web應用程序正在捕獲反序列化錯誤,並嘗試將請求重定向到錯誤處理程序頁面。由於它不是一個實際的頁面請求,重定向引發了一個錯誤,該錯誤強制重定向到錯誤處理程序頁面......直到太多重定向引發錯誤。

底層的問題在於將JSON反序列化爲.NET端相當複雜(集合)的類。用XML屬性裝飾器完美裝飾的類在模式中有選擇時使用抽象類(即一個或另一個元素)。如果沒有類似的JSON裝飾器,反序列化不知道如何反序列化JSON到哪個類。

相關問題