我有一个WPF应用程序,它公开了一个REST WCF服务(通过WebServiceHost
),其合同看起来像这样(简化):
[ServiceContract]
public interface IItemServiceContract
{
[WebGet(UriTemplate = "Items/{id}")]
Item GetItem(string id);
[WebGet(UriTemplate = "Items")]
IEnumerable<Item> GetItems();
[WebInvoke(UriTemplate = "Items", Method = "PUT")]
IEnumerable<Item> CreateItems(IEnumerable<Item> list);
}
当我使用浏览器导航到http://localhost:8070/Contoso/Services/Items/ItemService/Items
时,我得到的响应看起来像这样:
<ArrayOfItem xmlns="http://schemas.datacontract.org/2004/07/Contodo.Services.Items" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Item>
<ItemState>
<Comment i:nil="true"/>
<DeactivationTime>0001-01-01T00:00:00</DeactivationTime>
<Id>18f1a5e4-a94a-4f37-a533-3a75a10e7373</Id>
<IsSpecial>false</IsSpecial>
</ItemState>
<ItemTypeId>10</ItemTypeId>
<HelpInfo/>
<Identity>Ident1</Identity>
<AdditionalInfo>
<?xml version="1.0" encoding="utf-16"?>
<Content>
<SpecialContent />
</Content></AdditionalInfo>
<TextParameter>kjhdfsjh kj dkfjg kj</TextParameter>
<UserName i:nil="true"/>
</Item>
</ArrayOfItem>
使用JavaScript使用此服务的简单且无摩擦的方法是什么?客户端如何快速构建http请求和适当的XML?
我在Html5 / javaScript世界中相当不错,但在C#中我会有一个API,它以Item
对象为中心,并被序列化为XML。但这是去的方式吗?
更新:
基于第一个评论和答案,似乎XML不是JavaScript / webbrowser使用者的理想格式,但我不能只将格式更改为JSON,因为这可能会破坏已经依赖此XML的现有客户端格式。理想情况下,我会进行REST内容类型协商,并放置/获取JSON 或 XML。但这可以通过WCF REST服务完成吗?
答案 0 :(得分:3)
我想您使用的是ASP.NET 4.X。
WCF 4支持基于HTTP“Accept”和“Content-Type”请求标头的automatic format selection。一个在automaticFormatSelectionEnabled="true"
文件中指定web.config
属性:
<configuration>
<system.serviceModel>
<standardEndpoints>
<webHttpEndpoint>
<!-- the "" standard endpoint is used for auto creating a web endpoint. -->
<standardEndpoint name=""
helpEnabled="true"
automaticFormatSelectionEnabled="true"/>
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
</configuration>
有关详细信息,请参阅the article和the article的“消息格式选择”部分。您可以将automaticFormatSelectionEnabled属性与defaultOutgoingResponseFormat(可以设置为“xml”或“json”,默认为“xml”)组合。您可以仅为一个特定端点指定属性,而不是像上例中那样使用standardEndpoint
。
因此,您的现有WCF服务将仅为JavaScript请求提供JSON数据,如果您使用相应的WCF配置,仍会为其他客户端返回XML数据。
答案 1 :(得分:1)
试试这个
对于Json Type结果
在InterFace中
[WebInvoke(Method = "POST", UriTemplate = "/ItemGetItem?id={id}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
void ItemGetItem(string id);
脚本
self.GetItem= function () {
try {
$.ajax({
type: "POST",
url: "Your Url",
contentType: 'application/json',
async: false,
dataType: 'json',
cache: false,
success: function (response) {
},
error: function (ErrorResponse) {
}
});
}
catch (error) {
}
}
将客户端应用程序的端点用于使用此服务
答案 2 :(得分:1)
结帐WcfRestContrib。 this答案也可以帮助你。
答案 3 :(得分:0)
你看到http://www.codeproject.com/Articles/33234/A-beginner-s-guide-for-consuming-a-WCF-service-in
的所有拳头但我认为最简单的方法是将格式更改为Json。关于代码项目的文章也很好:http://www.codeproject.com/Articles/327420/WCF-REST-Service-with-JSON
答案 4 :(得分:0)
如果您使用的是jQuery,则可以使用$ .get函数(http://api.jquery.com/jQuery.get/)并将“xml”指定为数据类型:
$.get('http://.../', params, function(data) {
//process data
}, 'xml');
如果没有,您需要直接使用xmlHttpRequest(来自http://www.w3schools.com/xml/xml_parser.asp):
if (window.XMLHttpRequest)
{// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp=new XMLHttpRequest();
}
else
{// code for IE6, IE5
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET",url,false);
xmlhttp.send();
xmlDoc=xmlhttp.responseXML;
然后使用本机javascript xml解析器遍历xml节点相当容易。
但是JSON会更合适。
您可以为http://localhost:8070/Contoso/Services/Items/ItemService/Items.json
添加一条路径,该路由将以JSON格式返回结果。或者在网址中添加参数。
只有在您明确要求时,这两种方法都将返回JSON。因此,使用xml响应的现有代码仍然可以正常工作。