4

我有一个 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>
      &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-16&quot;?&gt;
      &lt;Content&gt;
        &lt;SpecialContent /&gt;
      &lt;/Content&gt;</AdditionalInfo>
    <TextParameter>kjhdfsjh kj dkfjg kj</TextParameter>
    <UserName i:nil="true"/>
  </Item>
</ArrayOfItem>

使用 JavaScript 使用此服务的简单且无摩擦的方法是什么?客户端如何快速构建 http 请求和相应的 XML?

我相当在 Html5/javaScript 世界中,但在 C# 中,我将有一个以Item序列化为 XML 的对象为中心的 API。但这是要走的路吗?

更新:

根据最初的评论和答案,XML 似乎不是 JavaScript/webbrowser 消费者的理想格式,但我不能只将格式更改为 JSON,因为这可能会破坏已经依赖此 XML 格式的现有客户端。所以理想情况下,我会进行 REST 内容类型协商并放置/获取 JSONXML。但这可以通过 WCF REST 服务来完成吗?

4

5 回答 5

4

我想您使用的是 ASP.NET 4.X。

WCF 4 支持基于请求的 HTTP“Accept”和“Content-Type”标头的自动格式选择。一个在文件中指定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>

有关详细信息,请参阅文章的“消息格式选择”部分和文章。您可以将automaticFormatSelectionEnabled属性与defaultOutgoingResponseFormat(您可以设置为“xml”或“json”,默认已经是“xml”)结合起来。您可以仅为一个特定端点指定属性,而不是如上例中的用法。standardEndpoint

因此,如果您使用相应的 WCF 配置,您现有的 WCF 服务只会为 JavaScript 请求提供 JSON 数据,并且仍会为其他客户端返回 XML 数据。

于 2013-05-08T13:46:49.333 回答
1

尝试这个

对于 Json 类型结果

在界面中

         [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) {


         }

     }

放置客户端应用程序的端点以使用此服务

于 2013-05-06T08:49:31.310 回答
1

查看WcfRestContrib这个答案也可能对您有所帮助。

于 2013-05-06T08:57:52.020 回答
0

你有没有看过http://www.codeproject.com/Articles/33234/A-beginner-s-guide-for-sumption-a-WCF-service-in

但我认为最简单的方法是将格式更改为 Json。还有一篇关于代码项目的好文章:http: //www.codeproject.com/Articles/327420/WCF-REST-Service-with-JSON

于 2013-05-03T21:42:48.047 回答
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 格式返回结果的路由。或者也在url中添加一个参数。仅当您明确要求时,这两种方法都将返回 JSON。因此,使用 xml 响应的现有代码仍然可以正常工作。

于 2013-05-12T05:46:33.773 回答