WCF分布式开发步步为赢(2)自定义托管宿主WCF解决方案开发配置过程详解
要创建WCF服务解决方案,首先应该定义服务类,并编写服务类的相关的代码。我们这里把服务类创建类单独的类库项目,托管宿主程序项目引用服务类的程序集。
2.0】创建WCF服务类库项目:
WCF服务类库项目的创建非常简单,Visual Studio 2008为我们提供了便捷的方式,选择新建项目,选择--WCF服务类库项目项目,输入项目名称,选择保存位置就可以。如图:
当然我们也可以建立空项目,但是程序集引用等操作要手动完整,过程相对复杂。这里我们选择的使用创建向导方式。
System.ServiceModel和System.Runtime.Serialization程序集对WCF服务至关重要,因为后续服务契约、操作契约和数据契约等特性定义都在这两个程序集中。我们在新建的项目引用中可以看到:
使用WCF契约相关的属性,必须显示引用这两个命名空间.语句如下:
using System.ServiceModel;
using System.Runtime.Serialization;
如果不添加命名空间引用程序集,编写的代码会出现错误,无法通过。
2.1】服务契约和操作契约:
WCF服务类库创建完毕后,我们可以来进行代码的实际编写。我们知道,每个WCF服务类均需实现一些方法,以供其客户端使用。服务类的创建者通过将这些方法包含在某个服务契约中,来决定将哪些方法公开为客户可调用的操作。服务契约就是显示指定的服务必须实现的用户可以使用的操作。
ServiceContract 属性以及 WCF使用的所有其他属性均在 System.ServiceModel 命名空间中定义,类声明使用 using 语句来引用该命名空间。服务类中可被客户端调用的每个方法都必须使用名为 OperationContract 的另一个属性加以标记。服务类中带有前置 OperationContract 属性的所有方法都将自动被WCF公开为 SOAP 可调用操作。
WCF中最基本的属性是 ServiceContract。实际上,WCF服务类本身就是标记有 ServiceContract 属性的类或者是实现了标记有该属性的接口的类。我们使用的还是上次的代码:
首先是服务契约IWCFService,定义了连个操作,添加[OperationContract]属性标记:
[ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")]
public interface IWCFService
{
//操作契约
[OperationContract]
string SayHello(string name);
//操作契约
[OperationContract]
string SayHelloToUser(User user);
}
其次定义WCF服务类,继承服务契约,实现服务契约中声明的操作,具体代码如下:
public class WCFService : IWCFService
{
//实现接口定义的方法
public string SayHello(string name)
{
Console.WriteLine("Hello! {0},Using string ", name);
return "Hello! " + name;
}
//实现接口定义的方法
public string SayHelloToUser(User user)
{
Console.WriteLine("Hello! {0} {1},Using DataContract ", user.FirstName, user.LastName);
return "Hello! " + user.FirstName + " " + user.LastName;
}
}
服务类里给出了服务契约里声明的方法,也就是操作,这里都给出了具体的实现。SayHello()和SayHelloToUser(User user)方法都将自动被WCF公开为 SOAP 可调用操作。客户端可以调用相应的操作。
2.2】数据契约:
数据契约定义类型如何转换为适合标准信息格式,即“序列化”过程。实际上,数据契约是控制数据如何序列化的一种机制。 在 WCF 服务类中,数据契约使用 DataContract 属性来定义。标记有 DataContract 的数据类、结构或其他类型都可以拥有一个或多个带有前置 DataMember 属性的成员,指示该成员必须被包含在此类型的序列化值中。不显示指定的成员不被包含在序列化数据中。这里我们定义的数据类,包含三个成员,代码如下:
[DataContract]
public struct User
{
[DataMember]
public string FirstName;
public string MiddleName;//不会被传递
[DataMember]
public string LastName;
}
由于是类库项目,所以主要涉及的内容是契约的定义和服务类的实现过程。配置的关键部分也是契约属性的标记。
不涉及配置文件的使用和定制,如果是应用程序,需要配置对应的Config文件。