Windows Communication Foundation 和 RESTful Web 服务入门






4.79/5 (19投票s)
学习如何创建和调试 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
- 用您的类装饰所需的类
配置
(不适用于契约或操作行为)
- 派生自
BehaviorExtensionElement
需要注意的是,行为是仅限服务器端的事情: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.cs 和 IService.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.svclog和app_messages.svclog。
双击打开app_tracelog。
Microsoft Service Trace Viewer 将打开。注意红线。
这些表示错误。让我们看看出了什么问题。
选择服务在 GetFeed
后抛出异常的部分。异常显示在此处。
显然,我们忘记添加 [ServiceKnownType]
属性,因为我们说我们要返回一个 SyndicationFeedFormatter
,它是 Atom10FeedFormatter
和 Rss20FeedFormatter
的基类。我们返回了一个 Atom10FeedFormatter
,但服务期望的是 SyndicationFeedFormatter
。ServiceKnownType
属性允许我们指定派生自服务所使用的基类或接口的类。
让我们现在就修复这个问题。
查找 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,它们就可以互操作。
首先,从以下链接下载并安装Fiddler:http://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”的属性的父对象中,该对象包含 FirstName
和 LastName
属性。
{"data":{"LastName":"Simpson", "FirstName": "Bart"}}
包装的父级 / 发送的对象
这是因为我们在方法调用的接口属性中将 bodystyle
设置为 WrappedRequest
,这可以用于发送多个参数。
如果我们设置 bodystyle
为 Bare
,我们将只发送对象而不是包装对象。
{"LastName":"Simpson", "FirstName", "Bart"}
现在就试试吧!
使用 C# 发送 JSON
与 SOAP 不同,使用“添加服务引用”无法直接处理 REST 服务。但是,有一些类可以帮助您达到目的:
WebHttpRequest
DataContractJsonSerializer
发起 HTTP 请求,您将正文内容放入 Stream
中,并从另一个 Stream
读取回复。
将类型序列化为 JSON
向解决方案中添加一个新的 Windows 控制台项目,名为 WCFJsonPost。设置它在应用程序运行时启动。
在您的项目中添加对 System.ServiceModel.Web
和 System.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 编程:http://msdn.microsoft.com/en-us/library/ms731067.aspx
- WCF Syndication:http://msdn.microsoft.com/en-us/library/bb412202.aspx
- WCF REST:http://msdn.microsoft.com/en-us/library/bb412169.aspx
- REST 概览(O'Reilly RESTful Web Services):http://oreilly.com/catalog/9780596529260
或者找一本好的书来帮助您入门。WCF 不会消失,越来越多的 Microsoft 技术正在使用它。几年之内,ASP.NET ASMX Web 服务将消失,取而代之的是 WCF 服务。在购买前尽量查看书籍内容,大多数 WCF 书籍很少关注 RESTful Web 服务开发。
希望本文档能帮助您理解 WCF RESTful Web 服务的一些概念,并为您今后的 WCF 探索之旅提供帮助。