我有一个Operation Contract,它接受一个复杂的对象,我通过jQuery调用操作。我如何传入类似jQuery的复杂类型对象。下面是操作签名:将复杂对象传递到WCF Rest服务
public Resolution CreateNewResolution(Resolution NewResolution);
我需要在客户机上的分辨率对象通过,但我不知道该怎么办像使用jQuery。任何帮助?
谢谢
我有一个Operation Contract,它接受一个复杂的对象,我通过jQuery调用操作。我如何传入类似jQuery的复杂类型对象。下面是操作签名:将复杂对象传递到WCF Rest服务
public Resolution CreateNewResolution(Resolution NewResolution);
我需要在客户机上的分辨率对象通过,但我不知道该怎么办像使用jQuery。任何帮助?
谢谢
一开始见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){ ... }
});
注意事项:
processData=true
,那么发送到服务的结果字符串是以查询字符串格式,而不是JSON。不是我想要传递复杂对象。所以我把它设置为false。对于更简单的非JSON请求,如果您在做WebGet,并且所有参数都在查询字符串中,那么使用true将会很好。msg
PARAM传递给成功回调包含返回的JSON。退房吉尔·芬克就结合WCF数据服务,JSONP和jQuery
在迈克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函数调用中连线的成功函数中完成的。以下是运行代码的输出:
摘要
在后我提供制备使用jQuery一个JSONP调用WCF数据服务的一个简单的例子。这种解决方案可以帮助您从客户端使用其他域中存在的WCF数据服务。在后续文章中,我将使用新的datajs库显示相同的示例
您是否更新此显示POST而不是PUT? POST通常被认为是避免跨站脚本问题的最安全方法 – LamonteCristo 2011-10-30 17:28:39