我有一个WCF服务定义如下:
Imports System.ServiceModel Imports System.ServiceModel.Web <ServiceContract()> Public Interface ILayoutService <OperationContract()> <WebInvoke(Method:="POST", BodyStyle:=WebMessageBodyStyle.WrappedRequest, RequestFormat:=WebMessageFormat.Json, ResponseFormat:=WebMessageFormat.Json)> Sub SaveLayout(ByVal layout As Layout) <OperationContract()> Function GetLayout() As Layout End Interface
所述Layout类的定义为:
Layout
Imports System.Runtime.Serialization <DataContract()> Public Class Layout <DataMember()> Public Property Columns As New List(Of ContentColumn) End Class <DataContract()> Public Class ContentColumn <DataMember()> Public Property Name As String = "Column Name" <DataMember()> Public Property Position As Integer <DataMember()> Public Property Modules As New List(Of ContentModule) End Class <DataContract()> Public Class ContentModule <DataMember()> Public Property Name As String = "Module Name" <DataMember()> Public Property Position As Integer End Class
ILayoutService的实现如下:
Imports System.ServiceModel.Activation Imports System.Web.Script.Serialization <AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Required)> 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()所以我可以得到将被(反)序列化的原义JSON。我正在使用它来测试通过jQuery调用此服务:
SaveLayout()
$(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()是serialize()VB代码中调用返回的确切JSON 。出于某种原因,当我调用Web服务,输入参数layout在SaveLayout()什么都不是。反序列化一定会失败。知道为什么吗?
buildLayout()
serialize()
layout
仅凭您提供的细节很难分辨。
这是我的建议:
在服务端启用跟踪,生成跟踪日志,并使用SvcTraceViewer进行分析。为此,请按照MSDN上有关使用服务跟踪查看器的文章中的说明进行操作。
打开调试异常。这可以通过上载includeExceptionDetailInFaults来完成,您可以按照此处的说明进行操作。
使用Fiddler监视客户端和服务端的有线通信。
通常,一旦执行此操作,您就应该在服务端获取更多有关时髦事件的信息,并且可以很快地诊断出问题。尝试一下,请报告!:)