WCF不反序列化JSON输入

我有一个WCF服务定义如下:

Imports System.ServiceModel Imports System.ServiceModel.Web  Public Interface ILayoutService   Sub SaveLayout(ByVal layout As Layout)  Function GetLayout() As Layout End Interface 

Layout类定义为:

 Imports System.Runtime.Serialization  Public Class Layout  Public Property Columns As New List(Of ContentColumn) End Class  Public Class ContentColumn  Public Property Name As String = "Column Name"  Public Property Position As Integer  Public Property Modules As New List(Of ContentModule) End Class  Public Class ContentModule  Public Property Name As String = "Module Name"  Public Property Position As Integer End Class 

ILayoutService的实现如下:

 Imports System.ServiceModel.Activation Imports System.Web.Script.Serialization  Public Class LayoutService Implements ILayoutService Public Sub SaveLayout(ByVal layout As Layout) Implements ILayoutService.SaveLayout Dim l As New Layout Dim left, center, right As New ContentColumn left.Name = "Left Column" left.Position = 0 center.Name = "Center Column" center.Position = 1 right.Name = "Right Column" right.Position = 2 Dim topLeft, centerLeft, bottomLeft, topCenter, centerCenter, bottomCenter, topRight, centerRight, bottomRight As New ContentModule topLeft.Name = "Top Left" topLeft.Position = 0 centerLeft.Name = "Center Left" centerLeft.Position = 1 bottomLeft.Name = "Bottom Left" bottomLeft.Position = 2 topCenter.Name = "Top Center" topLeft.Position = 0 centerCenter.Name = "Center Center" centerCenter.Position = 1 bottomCenter.Name = "Bottom Center" bottomCenter.Position = 2 topRight.Name = "Top Right" topRight.Position = 0 centerRight.Name = "Center Right" centerRight.Position = 1 bottomRight.Name = "Bottom Right" bottomRight.Position = 2 left.Modules.Add(topLeft) left.Modules.Add(centerLeft) left.Modules.Add(bottomLeft) center.Modules.Add(topCenter) center.Modules.Add(centerCenter) center.Modules.Add(bottomCenter) right.Modules.Add(topRight) right.Modules.Add(centerRight) right.Modules.Add(bottomRight) l.Columns.Add(left) l.Columns.Add(center) l.Columns.Add(right) Dim json As New JsonResult json.Data = l Dim serializer As New JavaScriptSerializer Dim output = serializer.Serialize(json.Data) End Sub Public Function GetLayout() As Layout Implements ILayoutService.GetLayout Dim l As New Layout Dim c As New ContentColumn Dim m As New ContentModule c.Modules.Add(m) l.Columns.Add(c) Return l End Function End Class 

我实现了SaveLayout()因此我可以得到将被(de)序列化的文字JSON。 我正在使用它来测试通过jQuery调用此服务:

 $(document).ready(function () { $("#saveLayout").click(function () { var layout = buildLayout(); var jsonLayout = $.toJSON(layout); $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", dataType: "json", url: "/Services/LayoutService.svc/SaveLayout", data: jsonLayout, dataType: "json", success: function (result) { alert(result.d.Columns[0].Name); }, error: function (xhr, ajaxOptions, thrownError) { var jsonFault = JSON.parse(xhr.responseText); alert(jsonFault.Message); } }); return false; }); }); function buildLayout() { var layout = { "Columns": [ { "Name": "Left Column", "Position": 0, "Modules": [ { "Name": "Top Left", "Position": 0 }, { "Name": "Center Left", "Position": 1 }, { "Name": "Bottom Left", "Position": 2}] }, { "Name": "Center Column", "Position": 1, "Modules": [ { "Name": "Top Center", "Position": 0 }, { "Name": "Center Center", "Position": 1 }, { "Name": "Bottom Center", "Position": 2}] }, { "Name": "Right Column", "Position": 2, "Modules": [ { "Name": "Top Right", "Position": 0 }, { "Name": "Center Right", "Position": 1 }, { "Name": "Bottom Right", "Position": 2}] }] }; return layout; } 

buildLayout()返回的布局是VB代码中serialize()调用返回的确切JSON。 出于某种原因,当我调用Web服务时, SaveLayout()的输入参数layout为Nothing。 反序列化必定会失败。 知道为什么吗?

很难从你提供的细节中分辨出来。

这是我的建议:

  • 在服务端启用跟踪,生成跟踪日志,并使用SvcTraceViewer进行分析。 为此,请按照此MSDN文章中有关使用服务跟踪查看器的说明进行操作 。

  • 打开调试例外。 这可以通过输入includeExceptionDetailInFaults来完成, 您可以按照此处的说明进行操作 。

  • 使用Fiddler监控客户端和服务端的线路流量。

一般来说,一旦你这样做,你应该有更多关于服务方面什么是时髦的信息,并且可以很快地诊断问题。 试试吧,请报告回来! 🙂