2010-01-14 77 views
11

我有一个Operation Contract,它接受一个复杂的对象,我通过jQuery调用操作。我如何传入类似jQuery的复杂类型对象。下面是操作签名:将复杂对象传递到WCF Rest服务

public Resolution CreateNewResolution(Resolution NewResolution); 

我需要在客户机上的分辨率对象通过,但我不知道该怎么办像使用jQuery。任何帮助?

谢谢

回答

22

一开始见Denny's post,虽然我不同意他使用GET的同意,并通过JSON查询字符串中的复杂PARAMS。这似乎是错误的。


您使用data的参数是的不论你的决定的类型是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字符串。有a nice, tiny jquery plugin to do thisDenny提供了他自己的实现。
  • 我发现如果我使用processData=true,那么发送到服务的结果字符串是以查询字符串格式,而不是JSON。不是我想要传递复杂对象。所以我把它设置为false。对于更简单的非JSON请求,如果您在做WebGet,并且所有参数都在查询字符串中,那么使用true将会很好。
  • 的dataFilter允许的日期时间正确的反序列化对象
  • msg PARAM传递给成功回调包含返回的JSON。
  • 您可能希望使用URL重写器来隐藏请求URL中的.svc标记
  • 在这种情况下,WCF服务使用webHttp行为,而不是enableWebScript。后者动态地生成Javascript代理来调用服务,但是你问这个问题的方式,使得它看起来像你不想要的那样。

+1

您是否更新此显示POST而不是PUT? POST通常被认为是避免跨站脚本问题的最安全方法 – LamonteCristo 2011-10-30 17:28:39

0

退房吉尔·芬克就结合WCF数据服务,JSONP和jQuery

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

在迈克Flasko的session在MIX11博客中,他展示了如何创建一个JSONP知道WCF数据服务与JSONPSupportBehavior属性可用于从MSDN代码库download(并应该是Microsoft.Data.Services.Extensions命名空间的一部分)。在这篇文章中,我将展示一个使用属性和jQuery的简单示例,以便为WCF数据服务创建JSONP跨域调用。

设置环境

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

[JSONPSupportBehavior] 
public class SchoolDataService : DataService<SchoolEntities> 
{ 
    // 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应用。下面是发出调用的代码:

<!DOCTYPE html> 
<html> 
<head runat="server"> 
    <title>JSONP Call</title> 
    <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.1.js" type="text/javascript"></script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <output id="result"> 
    </output> 
    </form> 
    <script type="text/javascript"> 
     $.getJSON('http://localhost:23330/SchoolDataService.svc/Courses?$format=json&$callback=?', 
     function (response) { 
      $.each(response.d, function (index, value) { 
       var div = document.createElement('div'); 
       div.innerHTML = value.Title; 
       $('#result').append(div); 
      }) 
     });   
    </script> 
</body> 
</html> 

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

enter image description here

摘要

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