将复杂对象传递到WCF Rest Service

我有一个操作契约,它接受一个复杂的对象,我通过jQuery调用该操作。 如何使用jQuery传入类似于复杂类型的对象。 以下是操作签名:

public Resolution CreateNewResolution(Resolution NewResolution); 

我需要在客户端传递一个Resolution对象,但我不知道如何使用jQuery。 有帮助吗?

谢谢

尽管我不同意他对GET的使用,并且在复杂参数的查询字符串中传递JSON,但请参阅Denny的post 。 这似乎是错的。


您用于data的参数是您的Resolution类型的json表示。 例如,假设在服务器端类似和操作定义如下:

 [DataContract( Namespace = "urn:brandon.michael.hunter/ws/2010/01", Name = "Resolution" )] public class Resolution { [DataMember( IsRequired = true, Name = "Name" )] public string Name { get; set; } [DataMember( IsRequired = true, Name = "Rank" )] public int Rank { get; set; } [DataMember( IsRequired = true, Name = "SerialNumber" )] public int SerialNumber { get; set; } [DataMember( IsRequired = false, Name = "Id" )] public int Id { get; set; } } [OperationContract] [WebInvoke(Method = "PUT", RequestFormat=WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, UriTemplate = "new")] public Resolution CreateNewResolution(Resolution r) { // your logic here r.Id = System.Guid.NewGuid(); return r; } 

然后,在Javascript中,您使用的代码可能如下所示:

 var resolution = {r: { Name : "Fred", Rank : 2, SerialNumber : 17268 }}; // convert object to JSON string (See http://jollytoad.googlepages.com/json.js) var objectAsJson = $.toJSON(resolution); // result is a string: '{"Name":"Fred","Rank":"2","SerialNumber":"17268"}' $.ajax({ type : "PUT", // must match Method in WebInvoke contentType : "application/json", url : "Service.svc/new", // must match UriTemplate in WebInvoke data : objectAsJson, dataFilter : function (data, type) { // convert from "\/Date(nnnn)\/" to "new Date(nnnn)" return data.replace(/"\\\/(Date\([0-9-]+\))\\\/"/gi, 'new $1'); }, processData : false, // do not convert outbound data to string (already done) success : function(msg){ ... }, error : function(xhr, textStatus, errorThrown){ ... } }); 

笔记:

  • 您需要将变量(r)的名称作为JSON中传递的第一个对象,至少使用WCF 4.当我使用前面的示例时,它直到我输入的名称才起作用变量开头。
  • 要在JSON中传递复杂对象,请使用PUT或POST作为请求的类型(HTTP方法)
  • 您需要将复杂对象转换为JSON字符串。 这是一个很好的,很小的jquery插件 。 丹尼提供了他自己的实现。
  • 我发现如果我使用processData=true ,那么发送到服务的结果字符串是查询字符串格式,而不是JSON格式。 不是我想传递复杂对象的东西。 所以我把它设置为假。 对于您正在进行WebGet的更简单的非JSON请求,使用true将是正常的,并且所有参数都在查询字符串中。
  • dataFilter允许正确反序列化DateTime对象
  • 传递给成功回调的msg参数包含返回的json。
  • 您可能希望使用URL重写器在请求URL中隐藏该.svc标记
  • 在这种情况下,WCF服务使用webHttp行为,而不是enableWebScript。 后者动态生成Javascript代理以调用服务,但您提出问题的方式使您看起来不想要这样。

查看Gil Fink关于组合WCF数据服务,JSONP和jQuery的博客

http://blogs.microsoft.co.il/blogs/gilf/archive/2011/04/24/combining-wcf-data-services-jsonp-and-jquery.aspx

在Mike Flasko在MIX11的会议期间,他展示了如何使用JSONPSupportBehavior属性创建一个支持JSONP的WCF数据服务,该属性可从MSDN代码库下载 (并且应该是Microsoft.Data.Services.Extensions命名空间的一部分)。 在这篇文章中,我将展示一个使用属性和jQuery的简单示例,以便为WCF数据服务进行JSONP跨域调用。

建立环境

首先,我开始创建两个不同的ASP.NET Web应用程序。 第一个应用程序包括调用页面,第二个应用程序包括WCF数据服务。 然后,我在第二个Web应用程序中创建了一个entity framework模型和该模型的WCF数据服务。 我还添加了我之前提供的链接中存在的JSONPSupportBehavior.cs类。 该类包括实现WCF IDispatchMessageInspector接口的JSONPSupportBehavior的实现。 它还包括我在我的代码中使用的JSONPSupportBehaviorAttribute。 代码很简单,看起来像:

 [JSONPSupportBehavior] public class SchoolDataService : DataService { // This method is called only once to initialize service-wide policies. public static void InitializeService(DataServiceConfiguration config) { config.SetEntitySetAccessRule("*", EntitySetRights.AllRead); config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; } } 

进行JSONP呼叫

在第二个Web应用程序中,我创建了一个将保存JSONP调用示例的Web表单。 以下是拨打电话的代码:

    JSONP Call    

让我们探索Web表单代码:首先我使用Microsoft CDN来检索jQuery库。 然后,我创建了一个HTML5输出元素,以便向其追加调用的输出。 在主脚本中,我使用jQuery的getJSON函数调用WCF数据服务。 请注意,为了从WCF数据服务获取JSON响应,您需要使用$ format = json查询字符串参数。 检索数据后,我迭代并为检索到的每个课程标题创建一个div元素。 这是在我在getJSON函数调用中连接的成功函数中完成的。 以下是运行代码的输出:

在此处输入图像描述

摘要

在post中,我提供了一个使用jQuery对WCF数据服务进行JSONP调用的简单示例。 这种解决方案可以帮助您从客户端使用存在于其他域中的WCF数据服务。 在后续文章中,我将使用新的datajs库显示相同的示例