【问题标题】:consuming an XML WCF REST webservice from JavaScript从 JavaScript 使用 XML WCF REST Web 服务
【发布时间】:2013-05-03 21:32:52
【问题描述】:

我有一个 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 对象为中心的 API,该对象被序列化为 XML。但这是要走的路吗?

更新:

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

【问题讨论】:

  • 该示例描述了如何在 JSON 中执行此操作,但我遇到了 XML 问题。
  • 看来你可以更改网络服务的来源。那么为什么不像我链接的教程中那样添加 JSON 响应 (WebInvoke(Method="POST",ResponseFormat=WebMessageFormat.Json)?
  • 这会破坏现有客户。我要么需要找到一种方法来进行内容类型协商,要么我想我必须为 JSON 添加新的 URL。
  • @bitbonk:你没有评论my answer。你使用 .NET 4.0/4.5 吗?您是否尝试使用automaticFormatSelectionEnabled 设置?您在使用 WCF RESTful 服务(它提供 XML 和 JSON 依赖于客户端请求)方面是否成功或存在一些问题?您需要其他帮助吗?

标签: javascript wcf web-services


【解决方案1】:

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

WCF 4 支持基于 HTTP“Accept”和“Content-Type”请求标头的 automatic format selection。在web.config 文件中指定automaticFormatSelectionEnabled="true" 属性:

<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 articlethe article 的“消息格式选择”部分。您可以将automaticFormatSelectionEnabled 属性与defaultOutgoingResponseFormat 结合使用(您可以设置为“xml”或“json”,默认已经是“xml”)。您可以只为一个特定端点指定属性,而不是像上面的示例中那样使用 standardEndpoint

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

【讨论】:

  • 这就像一个魅力。与 WCF 进行内容类型协商!由于我使用的是自托管 (WebServiceHost),我必须通过以下方式配置 AutomaticFormatSelectionEnabledWebHttpBehavior whb = endPoint.Behaviors.Find&lt;WebHttpBehavior&gt;(); if (whb != null) { whb.AutomaticFormatSelectionEnabled = true; } else { var webBehavior = new WebHttpBehavior { AutomaticFormatSelectionEnabled = true }; endPoint.Behaviors.Add(webBehavior); }
  • @bitbonk:我很高兴问题得到解决。自托管服务使用相同的方式。我个人更喜欢在自托管 RESTfull 服务中使用更苗条的 Web API 而不是 WCF。您不需要 SOAP。所以它对你来说可能是完美的。在HttpSelfHostConfiguration 实现的CreateAndConfigure 内部,您可以自定义格式化程序、编码等。所以我建议你检查一下 Web API 是否是你的最佳选择。
  • 是的,对于基于 HTTP 的 RESTful API,Web API 绝对优于 WCF
  • @bitbonk:可以轻松实现一些“高级场景”,例如压缩 HTTP 流量(参见 herehere),使用 HttpClientCredentialType.WindowsHttpClientCredentialType.Ntlm 身份验证(参见 @987654329 @) 通过覆盖 OnConfigureBinding 等。正如我所写,我个人喜欢 Web API。
【解决方案2】:

试试这个

对于 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) {


         }

     }

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

【讨论】:

  • 我知道如何将整个 web 服务更改为 JSON 并将其作为 JSON 与 JavaScript 一起使用。我的问题是我如何保留 XML 格式,并且仍然有一种简单的方法来使用 JavaScript 中的服务。所以我要么需要在 JavaScript 中使用 XML,要么有一个 additional 内容类型 JSON。对于后一种方法,我需要进行内容类型协商,这对于 WCF REST 服务似乎并不容易。
  • 这个链接可以帮助你codeproject.com/Articles/59551/…
  • 或者也可以看看这个codeproject.com/Articles/255684/…
  • 我看不出这两个链接中的任何一个如何回答我的问题。
【解决方案3】:

查看WcfRestContribthis 的回答也可能对您有所帮助。

【讨论】:

  • 我知道内容(类型)协商的概念,我在我的问题中明确提到了这一点。我的问题是我是否与 WCF REST 服务进行内容协商。
  • 查看 WCfRestContrib。他们的文档中有一个示例可以帮助您。 github.com/mikeobrien/WcfRestContrib/wiki/…
  • 您修改后的答案中的 WcRestContrib 项目看起来很有趣。
【解决方案4】:

你最先看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

【讨论】:

  • 有没有办法与 WCF REST 服务(通过 WebServiceHost)进行内容协商,以便在请求 JSON 时获取/放置 JSON,并且在请求 XML 时获取/放置 XML?另请注意,由于我将 Web 服务直接托管在 WPF 应用程序中,因此我无法使用初学者指南中所述的 AJAX-Enabled WCF Service Item Template
【解决方案5】:

如果您使用的是 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 响应的现有代码仍然可以正常工作。

【讨论】:

    猜你喜欢
    • 2011-06-09
    • 2014-02-27
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多