WCF 入门
Windows Communication Foundation (WCF) 基础知识
引言
我的文章只为初学者准备,这篇文章也不例外。本文涵盖了 Windows Communication Foundation (WCF) 的基础知识,以及使用 IIS 托管服务的基本实现。让我们简要讨论一下 WCF,它是什么,以及 WCF 的一些常见元素。
Windows Communication Foundation
我们已经看到或听说过 .NET 支持的许多通信技术。.NET 3.0 之前,我们面临着五种主要的应用程序之间远程通信的方法。每种方法都有其价值(因此它们存在于同一框架中),因为它们各自针对不同的问题集。然而,它们的运作方式不同,具有不同的编程模型、托管结构和配置实现。针对这些不同的平台需要广泛的知识。换句话说,要掌握所有这些通信技术,一个人必须了解所有这些截然不同的技术。
Windows Communication Foundation (WCF) 是将多种通信技术统一、简化和优化到单一模型中的演进。
WCF 的大部分功能包含在名为 System.ServiceModel.dll 的单个程序集中,位于 System.ServiceModel
命名空间中。
WCF 的执行边界
在使用 WCF 时,客户端从不直接与服务交互,即使是处理本地内存中的服务。相反,客户端始终使用代理来转发对服务的调用。代理公开与服务相同的操作。
WCF 的 ABC(地址、绑定、契约)
要使用 WCF 进行任何操作,我们需要 ABC。因此,我将根据我的理解对其进行一些解释。
地址
地址表示“服务在哪里?”
地址提供了两个重要元素:服务的所在地以及用于与服务通信的传输协议。
地址的所在地部分指出了目标计算机、站点或网络的名称;一个通信端口、管道或队列;以及一个可选的特定路径或 URI。
它支持以下传输协议
- HTTP
- TCP
- 点对点网络
- IPC(通过命名管道的进程间通信)
- MSMQ
WCF 地址看起来是什么样的?
它看起来是这样的:https://:8001/MyServicenet.msmq:///private/MyService。
数据绑定。
绑定指定“我如何与服务通信?服务如何可访问?”
WCF 定义了九种标准绑定。举几例
- 基本绑定:旨在将 WCF 服务公开为传统的 ASMX Web 服务,以便旧客户端可以与新服务协同工作。当客户端使用时,此绑定允许新的 WCF 客户端与旧的 ASMX 服务协同工作。
- TCP 绑定:在内部网络上用于跨计算机通信。它支持多种功能,包括可靠性、事务和安全性,并针对 WCF 到 WCF 的通信进行了优化。因此,它要求客户端和服务都使用 WCF。
其他绑定包括 IPC、点对点绑定、Web 服务绑定、双工 WS 绑定、MSMQ 绑定等。
契约
在 WCF 中,所有服务都公开契约。契约是描述服务功能的平台中立且标准的方式。WCF 定义了四种类型的契约。
- 服务契约:描述了客户端可以在服务上执行哪些操作。
- 数据契约:定义了传递到服务和从服务传递出来的数据类型。WCF 为 int 和 string 等内置类型定义了隐式契约,但您可以轻松为自定义类型定义显式的选择性数据契约。
- 故障契约:定义了服务会引发哪些错误,以及服务如何处理错误并将其传播给客户端。
- 消息契约:允许服务直接与消息进行交互。
命名空间和名称
契约命名空间在 WCF 中的作用与在 .NET 编程中相同:它用于限定契约类型并降低类型冲突的可能性。
[ServiceContract( Namespace = "http://www.MyCompany.com/" )]
默认情况下,契约的公开名称将是所使用的接口的名称。但是,您可以使用别名来在元数据中以不同的名称向客户端公开契约,方法是使用 ServiceContract
特性的 Name
属性。
[ServiceContract(Name = "IMyContract")]
interface IMyOtherContract
同样,公开操作的名称默认为方法名称,但您可以使用 OperationContract
特性的 Name
属性将其别名为不同的公开名称。
[ServiceContract]
interface IMyContract
{
[OperationContract(Name = "SomeOperation")]
void MyMethod(string text);
}
托管
托管环境使您的服务可以向客户端应用程序公开。它们促进了对服务操作的请求处理,但它们在服务的可用性和可伸缩性方面也起着关键作用。
Windows Communication Foundation (WCF) 服务可以与 Internet Information Services (IIS) 一起托管;使用 IIS 7.0 随附的新 Windows Activation Service (WAS);或者与任何托管应用程序进程一起托管,包括控制台、Windows Forms、Windows Presentation Foundation (WPF) 或托管 Windows 服务应用程序。为您的服务选择正确的托管环境主要取决于与传输协议和操作系统平台相关的部署要求。
今天,我将展示一个简单的程序,仅供初学者使用 IIS 托管。希望在我的下一篇文章中,我将以一种非常简单的方式展示所有其他类型的托管。
希望您拥有 VS 2008 或已安装适用于 .NET Framework 3.0 的 Visual Studio 2005 扩展。
一个演示 IIS 托管的基本应用程序,我们将创建一个具有 Add
和 Substract
方法的服务,并通过 ASP.NET 客户端使用它。
为了方便参考,我使用了默认的文件名。
一个基本 WCF 服务
服务
文件 > 新建 > 网站 > WCF 服务
在右侧,您会看到一个 Service.svc 文件,同时检查您的 App_Code 文件夹,其中将包含两个文件。
- IService.cs:这是您的契约。
- Service.cs:这是实现
IService
契约的服务。
打开 IService.cs 并替换
[ServiceContract]
public interface IService
{
[OperationContract]
string GetData(int value);
[OperationContract]
CompositeType GetDataUsingDataContract(CompositeType composite);
}
作者
[ServiceContract]
public interface IService
{
[OperationContract]
double Add(double a, double b);
[OperationContract]
double Substract(double a, double b);
}
打开 Service.cs 文件并替换
public string GetData(int value)
{
return string.Format("You entered: {0}", value);
{
public CompositeType GetDataUsingDataContract(CompositeType composite)
{
if (composite.BoolValue)
{
composite.StringValue += "Suffix";
}
return composite;
}
作者
public double Add(double a, double b)
{
return a + b;
}
public double Substract(double a, double b)
{
return a - b;
}
检查您的 web.config 文件,确保此行存在:
endpoint address="" binding="wsHttpBinding" contract="IService"
地址
:将是您的 localhost绑定
:此服务使用wsHttpBinding
绑定。契约
:还记得吗?这是您在 IService.cs 文件中的契约
名称。
现在将 Service.svc 设置为启动页并运行项目。如果代码正确,项目应该可以正常执行。
复制 URL 并将其保存在某个地方。URL 将类似于:https://:34935/WCFtest2/Service.svc。
现在我们需要为其创建一个客户端,该客户端将使用此服务。
客户端
右键单击解决方案 > 添加 > 新项目 > ASP.NET Web 应用程序。
现在右键单击您的 Web 应用程序并单击“添加服务引用”。将您复制的服务 URL 粘贴到地址文本框中。如果未复制,请再次运行包含 service.svc 文件的项目并复制它。
然后单击“确定”。服务将添加到您的项目中,名为“ServiceReference1
”(如果您未更改名称)。
现在转到您 *.aspx 页面的代码隐藏文件,在 page_load
事件中,编写以下代码:
ServiceReference1.ServiceClient obj = new ServiceReference1.ServiceClient();
double a = obj.Add(2.5,2.5);
Response.Write(a.ToString());
将您的 Web 应用程序设置为启动项目并运行应用程序。它将为您提供输出 5。
关注点
这只是 WCF 服务的一个基本表示,它的工作方式与 Web 服务类似。不要止步于此。希望我的下一篇文章将包含我们在 WCF 中可以进行的所有不同类型的托管。