65.9K
CodeProject 正在变化。 阅读更多。
Home

Windows Communication Foundation 和 RESTful Web 服务入门

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.79/5 (19投票s)

2010年1月29日

Ms-PL

18分钟阅读

viewsIcon

97151

学习如何创建和调试 RESTful Web 服务,以及使用流和 Feeds。

WCF 3.5 和 REST 简介

您想了解更多关于 WCF 或 WCF 的 RESTful 服务的信息,但又不知道如何快速上手并构建一个实际应用?那么,本教程将非常适合您。

预计所需时间:3-4 小时。

您可以在此处找到 PDF 版本:下载 PDF - 392.98 KB

所需条件

  • Visual Studio 2008 SP1
  • .NET 3.5 SP1
  • Windows SDK(我的安装中已包含:请检查您是否拥有 C:\Program Files\Microsoft SDKs\Windows\v6.0\Bin\SvcConfigEditor.exe

Visual Studio 和 .NET 都需要安装 SP1,不仅仅是 .NET。

WCF 基础知识

.NET 3.0(代号 .NET FX)以来,Microsoft 在 .NET Framework 中添加了许多新库。其中之一就是 WCF。WCF 在 .NET 3.5(C# 3.0)中通过 RESTful 功能进行了扩展,并与工作流基金会等技术集成。许多新的 .NET 3.5 技术也以 WCF 为基础。在 .NET 4.0 中,WCF 变得更加重要,并且在未来的几年里,WCF 将取代所有 Microsoft 分布式开发技术。

Windows Communication Foundation(WCF)的核心是“通信”。在独立应用程序中,例如 XML Spy 或记事本,您通常不会使用服务。

业务场景中,构建支持业务的系统需要投入大量资金。人们普遍认为,在这种情况下,您不想将一个功能绑定到特定的应用程序。所有应用程序,如果需要该特定功能,都应该能够重用它。您可以通过分发 DLL 给应用程序来实现这一点,但那样的话,当新版本发布时,您还需要更新脚本,并管理用户在 Windows 和数据库中的访问权限,而且用户可能会尝试使用旧的 DLL 来运行您的应用程序。这种场景存在几个缺点。

或者,您可以将功能暴露为一个服务,其中一个服务是由中心服务器或服务器集群提供的功能构建块。这个构建块或服务可以使用其他服务或 DLL。重要的是,该功能由中心管理并暴露给可能的客户端

一些优点包括:

  • 通过将函数组(如对象)分离到服务中,每个函数组都可以在网络上的任何服务器上托管,包括同一台服务器,或者在负载均衡的多台服务器上。
  • 易于实现服务的松耦合,因为通常使用代理类,所以您可以获得智能感知,而实际实现运行在服务器端。

那么,WCF 究竟是什么?它涉及到编写分布式系统和服务,并且暴露功能而不依赖于通信方式,这样通信方式就可以自由选择和更改。

一个WCF 服务是公开一组端点的程序。每个端点都是一个与世界通信的门户。通信由 WCF 处理,而响应消息的逻辑由开发人员编写。这使得开发人员能够开发不依赖于通信方式的逻辑。例如:TCP、点对点、SOAP、REST,无论它们是否经过身份验证或使用证书进行安全保护。

一个客户端是与一个或多个端点交换消息的程序。客户端还可以公开一个端点,以便在双工消息交换模式下接收来自服务的消息。

一个消息交换模式是客户端和服务如何交换消息的模式。有多种消息模式。REST 使用标准的 HTTP,因此它是一种请求-回复模式:浏览器或客户端请求页面,HTTP 服务器返回回复。

WCF 支持其他模式,如 Datagram(一次性发送)和 Duplex(双向)。还支持会话

WCF 是可扩展的:如果尚未支持某个协议,您可以将自己的逻辑注入到框架的几乎任何地方,以确保协议、传输方法等更改的开发成本最低。这称为行为,稍后将详细介绍。

.NET 3.0 中的传统 WCF 没有 RESTful 功能;这些功能在 .NET 3.5 中添加。这些功能包括 AJAX 支持、Atom 和 RSS Feeds 等。

这个决策树有助于在非 RESTful 场景中决定为端点使用哪种(绑定)技术(如您稍后将看到的,RESTful 场景始终使用相同类型的端点设置)。

(来源:http://weblogs.asp.net/spano/archive/2007/10/02/choosing-the-right-wcf-binding.aspx。)

不要被这个图表吓倒。总有一天你会发现它很有用。选择 SOAP 绑定时,请谨慎选择,您的选择会对性能产生严重影响。始终选择支持您目标的、最快的技术。与其选择一个包罗万象的 WS- 端点,不如选择两个快速、具体的端点——所以,请务必为 .NET 客户端选择 TCP 端点。

话虽如此,WCF 的速度肯定比它所取代的任何技术都快,包括 Remoting、ASMX,尤其是 WSE 2.0。WCF 的速度快很多,并且能产生相同的结果。

完整的性能比较,请参阅:http://msdn.microsoft.com/en-us/library/bb310550.aspx

REST 基础知识

REST 是一种面向资源的架构。重点在于数据,而不是操作。我们所知的 WKB 中的内容,就是资源的一个典型例子。

REST 与 SOAP 不同。SOAP 是一种复杂的互操作协议,提供多层安全性、版本控制等,因此会大大增加消息的开销。通常,SOAP 通过 HTTP 运行,但在 WCF 中,它也可以通过 TCP 或其他连接运行。SOAP 绕过了许多 HTTP 语义,并再次将它们作为自己的语义实现。REST 则是一种轻量级、更简单的协议,它遵循 HTTP 的工作方式及其所有语义:GET 的头部值为检索某项内容,PUT 或 POST 用于保存某项内容,DELETE 用于删除资源。SOAP 更通用,但非常复杂且速度慢。REST 速度快得多,提供的功能少得多,并且仅限于 HTTP。

端点无处不在

服务端点包含:

  • 一个地址
  • 一个绑定
  • 以及一个契约

= 通信基础的 ABC

端点的地址是网络地址或 URI =在哪里

端点的契约指定了端点通信的内容,本质上是一组按操作组织的、具有基本消息交换模式(MEP)的消息,例如单向、双工和请求/回复。通常,我们使用带有属性的接口来定义契约 =什么

有几种类型的契约:

服务契约

描述客户端可以在服务上执行的操作。

  • ServiceContractAttribute
  • 应用于接口。

  • OperationContractAttribute
  • 应用于您希望公开的接口方法。

数据契约

定义在服务之间传递的自定义数据类型(高级)。

  • DataContract
  • 应用于包含数据的类。

  • DataMember
  • 应用于您希望交换的类的属性。

- 或 -

消息契约

直接与 SOAP 消息交互(低级)。当存在必须遵守的现有消息格式时非常有用。

故障契约

定义服务如何处理错误并将其传播给客户端。

端点的绑定指定了端点如何与世界通信,包括传输协议(例如 TCP、HTTP)、编码(例如文本、二进制)和安全要求(例如 SSL、SOAP 消息安全)=如何

行为是一个实现特殊接口的类,用于“插入到”执行过程中。这是您主要的 WCF扩展性和自定义点,如果某些内容并非开箱即用。=调整在哪里/什么/如何

有几种类型的行为:

服务行为

  • 应用于应用程序中整个服务的运行时
  • 实现 IServiceBehavior

契约行为

  • 应用于整个契约
  • 实现 IContractBehavior

操作行为

  • 应用于服务操作(考虑:方法调用)
  • 实现 IOperationBehavior

端点行为

  • 应用于端点
  • 实现 IEndpointBehavior

创建行为是您在本讲座后可以尝试的内容,或者可以要求另一场讲座来讲解。有三种方法:

编写代码

  • 实现行为接口
  • 将您的行为添加到 Behaviors 集合中
  • 启动服务主机

使用属性装饰

(不适用于端点行为)

  • 实现行为接口
  • 继承自 Attribute
  • 用您的类装饰所需的类

配置

(不适用于契约或操作行为)

需要注意的是,行为是仅限服务器端的事情:WCF 客户端类不使用它们。

在许多项目中,不需要行为,您只需要 ABC。但通常需要稍作调整。这时我们添加另一个 B - ABBC。几乎是 ABBA,但又不是。

所有这些一开始可能看起来有点令人望而生畏。暂时不要太在意细节。当您使用 SOAP 时,您需要了解更多关于它们的信息。由于 WCF 非常强大,有很多知识需要了解。简单的场景不需要您深入了解所有内容,正如您将看到的,如果您了解一些基础知识,您将很快启动您的服务。对于 REST 场景,您不需要了解所有细节即可入门,因此在本讲座中我们不会详细介绍。

现在,让我们开始吧。

探索您的托管选项

在 Microsoft .NET 平台上,您可以使用 Microsoft Visual Studio .NET 创建几种类型的托管 Windows 应用程序:

  • WinForms 应用程序
  • 控制台应用程序
  • Windows 服务
  • Web 应用程序(ASP.NET),托管在 Internet Information Services (IIS) 上
  • WCF 服务,托管在 IIS 7.0 和 Windows Vista 或 Windows Server 2008 上的 WAS 中

WCF 不会阻止您在任何其他类型的应用程序中运行服务,只要它为您提供 .NET 应用程序域。这完全取决于您对主机提出的要求。为了总结这些选项,请考虑以下三类通用的 WCF 服务主机:

  • 在任何托管的 .NET 应用程序中自托管
  • Windows 服务中的托管
  • 在不同版本的IIS/ASP.NET中托管

我们最终将把服务放在控制台中进行自托管,从而创建自己的 Web 服务器(某种程度上)!

创建新的服务库

  • 创建一个新的WCF 服务库
  • 删除 Service.csIService.cs

为什么我们只创建一个服务库然后又全部删除?有些项目类型会向菜单添加条目。在此例中,它将添加可视化编辑app.config的功能。

定义和实现契约

定义契约的最简单方法是创建一个接口或类,并用 ServiceContractAttribute 进行注解。

例如

using System.ServiceModel;
 
//a WCF contract defined using an interface
[ServiceContract]
public interface IMath
{
    [OperationContract]
    int Add(int x, int y);
}

然后,创建一个实现 IMath 的类。该类成为 WCF 服务类。例如:

//the service class implements the interface
public class MathService : IMath
{
    public int Add(int x, int y)
    { return x + y; }
}

定义端点

端点可以在代码配置中定义。我们将使用配置。

<configuration>
        <system.serviceModel>
               <behaviors>
                       <serviceBehaviors>
                               <behavior name="mexSvcBehaviour">
                                      <serviceMetadata httpGetEnabled="false" 
                                      httpsGetEnabled="false" />
                               </behavior>
                       </serviceBehaviors>
               </behaviors>
               <bindings />
               <services>
                       <service behaviorConfiguration="mexSvcBehaviour" 
                       name="WCFRest.MathService">
                               <endpoint address="https://:41000/MathService/Ep1" 
                               binding="wsHttpBinding"
                                contract="WCFRest.IMath" />
                               <endpoint address="https://:41000/MathService/mex" 
                               binding="mexHttpBinding"
                                bindingConfiguration="" contract="IMetadataExchange" />
                       </service>
               </services>
        </system.serviceModel>
</configuration>

通常,首选配置。在某些项目类型中,通过右键单击App.config,您会找到编辑 WCF 配置菜单选项。

使用此编辑器,您可以轻松设置服务所需的选项。如果不存在,请在 app.config 上运行C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\SvcConfigEditor.exe 来打开同一个编辑器。

现在,只需将上面的App.config复制粘贴到您的文件中即可。

测试客户端

如果运行您的服务,您会看到测试客户端在运行 DLL 时自动配置为运行

注意:测试客户端对于 REST 测试没有用。如果您启动一个 SyndicationLibrary 项目,将使用 IE 而不是 WCF 测试客户端。

使用服务

有两种方法可以生成类:

SvcUtil.exe

它位于此处:C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin\svcutil.exe。它是一个有用的工具,可以根据 WSDL 生成类。

添加服务引用

类似于添加引用,但菜单选项就在下方

  • 向解决方案中添加一个新的 Windows 控制台项目,名为 WCFClient
  • 按照上述方式向服务添加服务引用,并使用您记得的命名空间。
  • 添加对 System.ServiceModel 的普通引用。
  • static void main 中,执行以下操作:
internal class Program
{
    /// <summary>
    /// Starts the application
    /// </summary>
    /// <param name="args"></param>
    internal static void Main(string[] args)
    {
        MathClient client = new MathClient();
        Console.WriteLine(client.Add(10, 20));
        Console.ReadKey();
    }
}

提示:如果您的应用程序稍后停止工作,因为客户端无法确定连接到哪个绑定,请更改以下行:

MathClient client = new MathClient("WSHttpBinding_IMath");

从控制台托管服务

  • 向您的解决方案中添加一个新的Windows 控制台项目,名为 WCFHost
  • 向您的服务项目添加引用。
  • 添加对 System.ServiceModel 的引用。
  • 编辑您引用的 WCF 库项目的属性,然后转到WCF Options选项卡。然后,取消选中以下选项:
  • WCF 库中的 App.config 复制到您的 WCFHost 项目中。
  • 在您的WCFHost项目的 static void main 方法中(如果还没有,请键入 svm tab tab),执行以下操作:
internal static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    internal static void Main()
    {

        using (ServiceHost serviceHost = 
                 new ServiceHost(typeof(WCFRest.MathService)))
        {
            try
            {
                // Open the ServiceHost to start listening for messages.
                serviceHost.Open();

                // The service can now be accessed.
                Console.WriteLine("The service is ready.");
                Console.WriteLine("Press <ENTER> to terminate service.");
                Console.ReadLine();

                // Close the ServiceHost.
                serviceHost.Close();
            } 
            catch (TimeoutException timeProblem)
            {
                Console.WriteLine(timeProblem.Message);
                Console.ReadLine();
            } 
            catch (CommunicationException commProblem)
            {
                Console.WriteLine(commProblem.Message);
                Console.ReadLine();
            }
        }
    }
}

现在,请确保在启动时运行这两个项目。右键单击解决方案,然后选择属性。在Startup Project列表中,将 WCFClient 和 WCFHost 的 Action 更改为 Start。

然后,按向上箭头按钮,确保 WCFHost 在 WCFClient 项目之前启动。

运行应用程序。服务应该已经启动,并且您应该收到服务返回的“30”作为回复。

发生了什么?

  • WCFHost 在 Windows 应用程序中托管服务,任何应用程序现在都可以托管服务。
  • WCFClient 通过生成的代理类连接到该服务,因此您可以进行编译并获得智能感知。
  • WCFClient 通过代理调用方法,代理透明地调用服务。

将服务转换为 REST Web 服务

注意:将数学服务(一个面向动作的、执行某些操作的服务)转换为 REST 服务(一个面向资源的服务(对数据的 CRUD 操作))可能不是一个好习惯。这里展示的内容很难被视为良好的设计,但还是让我们继续吧。

回到您的服务项目,以及 IMath 接口。

  • 要查看您的选项,您必须首先添加对 System.ServiceModel.Web 的引用。
  • 然后,按如下方式更改接口:
[WebInvoke(Method = "GET",
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Bare,
    UriTemplate = "?x={x}&y={y}")]
int Add(int x, int y);

请注意,您可以在接口中使用数字字符串作为URI 模板的参数,但前提是它们是查询字符串的一部分。在 URL 本身中,只支持字符串。您也可以返回其他类或从 HTTP 正文中接受类(稍后会介绍)。

  • 添加如图所示的绑定配置,并将其命名为 webHttpBindingConfig
  • 在“高级”下,定义一个新的服务端点行为,并添加 webHttp 元素。将其命名为 webHttpEndpointBehaviour
  • 然后,最后,添加一个新的服务端点,并填写如下字段:
  • 保存。

像以前一样运行应用程序,两个应用程序应该仍然可以工作。当它们运行时,请将您喜欢的浏览器指向 https://:41000/MathService/web/?x=10&y=20。请注意,这是端点的 URL 加上方法调用的 URL 模板。

这应该会返回一个 JSON 回复。如果下载它,它应该包含“30”。

恭喜您构建了第一个 WCF REST 服务。它可以将两个数字相加并告诉您结果。

返回文件或大量数据

您还可以返回。流推荐用于大量数据,或用于您磁盘上的文件并希望返回的文件。例如,您的 Web 服务可能会返回图片的链接,而您也需要返回图片。

在接口中添加一个方法,如下所示:

[OperationContract]
[WebInvoke(Method = "GET",
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Bare,
    UriTemplate = "notepad")]
Stream GetStream();

注意:您还可以使用 WebGet 属性,它专门用于 GET 请求。请尝试改用 WebGet 属性。

然后,在您的具体 MathService 类中实现新方法:

public Stream GetStream()
{
    return File.OpenRead(@"c:\windows\notepad.exe");
}

再次运行应用程序,并通过将浏览器指向以下 URL 来下载您自己的记事本:https://:41000/MathService/web/notepad

请注意,有一些服务设置会限制可以发送或接收的消息大小。此外,如果您在 IIS 中托管,IIS 服务器的限制也需要在 web.config 中进行调整。

更具体地说,您可能需要调整以接收和发送大型文件的常见设置包括端点、服务以及客户端本身的消息大小(通过内置行为添加),并且可能还需要调整 ASP.NET 的HTTP 请求大小

<httpRuntime maxRequestLength="xxx"/>

返回 Feed

在 WCF 中,支持两种标准 Feed 格式:

  • Atom 1.0
  • RSS 2.0

生成 Feed 使用 SyndicationFeed 类完成。

  • 创建 SyndicationFeed 实例
  • 分配属性和内容
  • 使用格式化程序返回并格式化它
    • Atom10FeedFormatter
    • Rss20FeedFormatter

那么,让我们开始吧。

将以下代码添加到您的 IMath 接口中:

[WebGet(UriTemplate = "feed?rss={rss}")]
[OperationContract]
SyndicationFeedFormatter GetFeed(bool rss);

然后,如下实现新方法:

public SyndicationFeedFormatter GetFeed(bool rss)
{
    List<SyndicationItem> items = new List<SyndicationItem>();

    // make link to notepad
    SyndicationItem item = new SyndicationItem();
    item.Title = new TextSyndicationContent
                       ("Notepad on server.");
    item.Links.Add(new SyndicationLink(
       new Uri("https://:41000/MathService/web/notepad")));
    item.PublishDate = DateTime.Now;
    items.Add(item);

    SyndicationFeed feed =
        new SyndicationFeed
            ("Notepad Feed",
            "Feed with links to notepad.exe",
            new Uri("http://www.google.be"), // alternate link is google
            items);
    feed.LastUpdatedTime = DateTime.Now;
    if (rss)
    {
        return new Rss20FeedFormatter(feed);
    }
    return new Atom10FeedFormatter(feed);
}

运行应用程序。应用程序正常运行。将浏览器指向以获取我们刚才创建的 Feed:https://:41000/MathService/web/feed

哎呀!发生了一个错误,如果您在调试时单步执行方法调用,根本不会抛出任何异常。网页也没有提供任何有用的信息。怎么回事?

调试 WCF

为了找出问题所在,让我们启用一些我们不希望在生产环境中激活的功能。我们只会编辑 WCFHost 项目的app.config,而不是生成 DLL 的那个。

首先,启用异常信息。这主要用于 SOAP。

编辑其中存在的服务行为,添加 serviceDebug 元素(另一个是启用测试客户端的元数据,以及用于生成类的“添加服务引用”)。

然后,启用消息日志记录跟踪

最后,保存您的app.config并再次运行应用程序。使用浏览器访问 Feed 页面:https://:41000/MathService/web/feed

然后,打开 WCFHost 项目的文件夹。

注意文件夹中新创建的文件app_tracelog.svclogapp_messages.svclog

双击打开app_tracelog

Microsoft Service Trace Viewer 将打开。注意红线

这些表示错误。让我们看看出了什么问题。

选择服务在 GetFeed 后抛出异常的部分。异常显示在此处。

显然,我们忘记添加 [ServiceKnownType] 属性,因为我们说我们要返回一个 SyndicationFeedFormatter,它是 Atom10FeedFormatterRss20FeedFormatter 的基类。我们返回了一个 Atom10FeedFormatter,但服务期望的是 SyndicationFeedFormatterServiceKnownType 属性允许我们指定派生自服务所使用的基类或接口的类。

让我们现在就修复这个问题。

查找 ServiceKnownTypeAttribute 类,示例表明您将一个放在接口(您的 IMath 接口)的顶部:http://msdn.microsoft.com/en-us/library/system.servicemodel.serviceknowntypeattribute.aspx

像这样将属性添加到接口:

[ServiceContract]
[ServiceKnownType(typeof(Atom10FeedFormatter))]
[ServiceKnownType(typeof(Rss20FeedFormatter))]
public interface IMath

如果浏览器是 IE,请关闭它,然后打开一个新的。重新访问 URL 以获取您的 Feed:https://:41000/MathService/web/feed。您应该能看到您的 Feed 正常运行。

别忘了再次关闭消息日志记录和跟踪,并删除服务日志文件,否则当您真正需要它们时,您会花费数分钟来解析文件!

接受数据

WCF 可以接受来自 JavaScript/XML(在正文中)或来自 URI 的输入。系统会查找所有未在 URI 模板中使用的方法参数。可以使用 AJAX(开箱即用)或 WebForms(配合 CodePlex 上的 WCF REST 入门工具包:如果您有兴趣,请要求另外的讲座)的成员进行通信。对于 AJAX,可以使用 XML 或 JSON 来填充方法调用中的类成员。

AJAX

Asynchrnonous Javascript and XML(异步 JavaScript 和 XML),用于在不进行完整页面回发和刷新所有内容的情况下更新网页,如果使用得当,可以节省处理时间和带宽。理论上,您必须使用 XML,但 JSON 更为常见。不过,AJAX 听起来不太可靠。

JSON

JavaScript Object Notation(JavaScript 对象表示法)。简而言之,JavaScript 编写对象变量的方式。

XML

Extensible Markup Language(可扩展标记语言)。在这种情况下,另一种编写对象的方式。

注意:WCF 可以与 ASP.NET ScriptManager 和 ASP.NET AJAX(如果您对此感兴趣,请要求另外的讲座)协同工作。WCF 还可以与jQuery协同工作,jQuery 是用于动态页面操作的领先 JavaScript 库。这两个主题都超出了本讲座的范围。如果它谈论 XML、SOAP 或 JSON,它们就可以互操作。

首先,从以下链接下载并安装Fiddlerhttp://www.fiddler2.com/Fiddler2/version.asp

Fiddler 是一个HTTP 调试器,它允许您创建自定义请求——许多网站管理员认为“隐匿性安全”是个好主意,但我们不是其中之一。

接下来,我们将准备我们的服务。

创建一个名为 PostedData 的新类,如下所示:

[DataContract]
public class PostedData
{
    [DataMember]
    public string FirstName { get; set; }
    [DataMember]
    public string LastName { get; set; }
}

将以下内容添加到您的服务接口中:

[OperationContract]
[WebInvoke(Method = "POST",
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.WrappedRequest,
    UriTemplate = "data")]
void PostData(PostedData data);

然后,在您的服务中用以下代码实现该方法:

public void PostData(PostedData data)
{
    if (data == null)
    {
        Console.WriteLine("null");
        return;
    }

    Console.WriteLine("Received: " + data.FirstName + 
                      " " + data.LastName);
}

运行您的应用程序。

启动Fiddler并创建一个自定义请求,如图所示:

然后按标记为Execute的按钮。您可能想知道为什么我们将发送数据的类包装在一个名为“data”的属性的父对象中,该对象包含 FirstNameLastName 属性。

{"data":{"LastName":"Simpson", "FirstName": "Bart"}}

包装的父级 / 发送的对象

这是因为我们在方法调用的接口属性中将 bodystyle 设置为 WrappedRequest,这可以用于发送多个参数。

如果我们设置 bodystyleBare,我们将只发送对象而不是包装对象。

{"LastName":"Simpson", "FirstName", "Bart"}

现在就试试吧!

使用 C# 发送 JSON

与 SOAP 不同,使用“添加服务引用”无法直接处理 REST 服务。但是,有一些类可以帮助您达到目的:

  • WebHttpRequest
  • 发起 HTTP 请求,您将正文内容放入 Stream 中,并从另一个 Stream 读取回复。

  • DataContractJsonSerializer
  • 将类型序列化为 JSON

向解决方案中添加一个新的 Windows 控制台项目,名为 WCFJsonPost。设置它在应用程序运行时启动。

在您的项目中添加对 System.ServiceModel.WebSystem.Runtime.Serialization 的引用。

然后,将以下代码添加到您的 Program 类中:

internal class Program
{
    internal static void Main(string[] args)
    {
        Thread.Sleep(10000);
        TestWcfRestPost();
    }

    private static void TestWcfRestPost()
    {
        // create the serializer that saves classes as JSON
        DataContractJsonSerializer serializer = 
           new DataContractJsonSerializer(typeof(PostedData));
        PostedData dataToPost = new PostedData
                                    {
                                        FirstName = "Bart",
                                        LastName = "Simpson"
                                    };
        // set up our request
        HttpWebRequest request = 
          (HttpWebRequest)HttpWebRequest.Create(
          @"https://:41000/MathService/web/data");
        request.Accept = "*/*";
        // we're going to post JSON
        request.ContentType = "application/json";
        request.Method = "POST";
        using (Stream stream = request.GetRequestStream())
        {
            // send data
            serializer.WriteObject(stream, dataToPost);
            stream.Flush();
        }

        // get the response
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        using(Stream stream = response.GetResponseStream())
        {
            using(TextReader reader = new StreamReader(stream))
            {
                Console.WriteLine(reader.ReadToEnd());
            }
        }
    }
}

运行应用程序以查看与 Fiddler 相同的结果,也就是说,如果您在上一个主题的最后将 bodystyle 设置为 Bare

深入阅读

或者找一本好的书来帮助您入门。WCF 不会消失,越来越多的 Microsoft 技术正在使用它。几年之内,ASP.NET ASMX Web 服务将消失,取而代之的是 WCF 服务。在购买前尽量查看书籍内容,大多数 WCF 书籍很少关注 RESTful Web 服务开发。

希望本文档能帮助您理解 WCF RESTful Web 服务的一些概念,并为您今后的 WCF 探索之旅提供帮助。

© . All rights reserved.