【问题标题】:Client configuration to consume WCF JSON web service使用 WCF JSON Web 服务的客户端配置
【发布时间】:2010-10-24 13:33:07
【问题描述】:

我已将 Web 服务配置为使用此博客中所述的 Json:http://www.west-wind.com/weblog/posts/164419.aspx 和其他各种博客,但我无法创建客户端来使用此服务。我尝试了各种方法,但总是遇到毫无意义的异常。实现(我应该添加的 WCF)客户端的正确方法是什么?

【问题讨论】:

  • 服务是否与客户端在同一个域中运行?我遇到了一个问题,我的服务在我的客户端以外的域上运行,并且永远无法让他们进行通信。然后我突然意识到,AJAX 不允许跨域通信,nativley。

标签: c# .net wcf web-services json


【解决方案1】:

似乎缺少有关如何为 JSON REST 服务编写 WCF 客户端的示例。似乎每个人都使用 WCF 来实现服务,但几乎从不使用 WCF 来编写客户端。所以这里有一个相当完整的服务示例(实现一个 GET 和一个 POST 请求)和客户端。

服务

服务接口

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [WebGet(ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Bare,
        UriTemplate = "/getcar/{id}")]
    Car GetCar(string id);

    [OperationContract]
    [WebInvoke(RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Bare,
        UriTemplate = "/updatecar/{id}")]
    Car UpdateCar(string id, Car car);
}

服务数据结构

[DataContract]
public class Car
{
    [DataMember]
    public int ID { get; set; }

    [DataMember]
    public string Make { get; set; }
}

服务实现

public class Service1 : IService1
{
    public Car GetCar(string id)
    {
        return new Car { ID = int.Parse(id), Make = "Porsche" };
    }

    public Car UpdateCar(string f, Car car)
    {
        return car;
    }
}

服务标记

<%@ ServiceHost Language="C#" Service="JSONService.Service1"
    CodeBehind="Service1.svc.cs"
    Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>

Web.config

<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
  </system.webServer>   
</configuration>

客户

现在是客户端。它重用了接口IService1 和类Car。另外,需要以下代码和配置。

App.config

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <behaviors>
      <endpointBehaviors>
        <behavior name="webby">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <client>
      <endpoint address="http://localhost:57211/Service1.svc" name="Service1" binding="webHttpBinding" contract="JSONService.IService1" behaviorConfiguration="webby"/>
    </client>
  </system.serviceModel>
</configuration>

Program.cs

public class Service1Client : ClientBase<IService1>, IService1
{
    public Car GetCar(string id)
    {
        return base.Channel.GetCar(id);
    }


    public Car UpdateCar(string id, Car car)
    {
        return base.Channel.UpdateCar(id, car);
    }
}


class Program
{
    static void Main(string[] args)
    {
        Service1Client client = new Service1Client();
        Car car = client.GetCar("1");
        car.Make = "Ferrari";
        car = client.UpdateCar("1", car);
    }
}

玩得开心。

【讨论】:

  • 客户端实现示例在互联网上非常罕见,这是真的。它帮助我解决了我的问题。
  • 我问了另一个关于在 WCF 客户端中访问 HTTP 状态代码的问题。请问你能看到那个并抛出一些光吗? stackoverflow.com/q/4677052/23671
  • 我很好奇。将 REST 服务隐藏在基于 RPC 的客户端代理后面有什么意义。为什么不只使用 SOAP?通过像这样在客户端上使用 WCF,恕我直言,您已经失去了 REST 可能带来的所有好处。
  • 这个例子只是我在为一个主要使用 JSON(用 Java 实现)的现有 REST 服务编写 WFC 客户端时进行的一些实验的副产品。该服务看起来非常不同,并且几乎完全是只读的。事实证明,它非常适合其用途:以紧凑的格式和单一请求提供具有所选详细程度的数据。客户端是带宽有限的移动电话,通常意味着往返时间。幸运的是,该服务不是 SOAP(太复杂、太冗长)。而且 RPC 风格的代理很容易使用...
  • 您确实意识到它不是 REST,对吧? RPC over HTTP 可能很有价值,但它无法实现 REST 架构带来的好处。
【解决方案2】:

有哪些例外?它们对您来说可能毫无意义,但这里的一些人可能会发现它们有助于诊断您的问题。我使用 jQuery 向 WCF 服务发出 ajax 请求,设置通常如下所示:

     $(document).ready(function() {

        $.ajaxSetup({
            type: "POST",
            processData: true,
            contentType: "application/json",
            timeout: 5000,
            dataType: "json"
        });
        var data = { "value": 5 };

        AjaxPost("GetData", data, OnEndGetData, OnError);
    });

    function OnEndGetData(result) {
        alert(result.GetDataResult);
    }

    function OnError(msg) {
        alert(msg);
    }

function AjaxPost(method, data, callback, error) {
    var stringData = JSON.stringify(data);
    var url = "Service1.svc/" + method;

    $.ajax({
        url: url,
        data: stringData,
        success: function(msg) {
            callback(msg);
        },
        error: error
    });
}

JSON.stringify() 可以在 json.org 脚本中找到:http://www.json.org/js.html,我对 GetData 方法的签名如下所示:

[OperationContract]
[WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat =   WebMessageFormat.Json)]
string GetData(int value);

【讨论】:

  • 嗨,也许我不够清楚,但我真的想在 C# 中的 winform 应用程序中实现 WCF 客户端,而不是 Web 客户端。
  • 我也收到$.ajax({ 行的错误:$ 未定义
  • 我不确定您是否可以在不使用普通旧 WebClient 或 HttpRequest/Response 设置的情况下实现 JSON 客户端。 $ 是 jQuery 的一部分。
  • 这个答案与创建/配置 WCF 客户端有什么关系??
  • @nashwan 问题没有指定什么样的 wcf 客户端。我使用 jquery 和 js 创建了一个客户端。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-06-24
  • 1970-01-01
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 2016-11-28
相关资源
最近更新 更多