将 LINQ-to-SQL 查询集成到 WCF 服务中






1.74/5 (10投票s)
本文展示了如何在WCF服务中使用LINQ to SQL查询。
引言
本文展示了如何在WCF服务中定义LINQ-to-SQL查询,并创建WCF客户端以显示WCF服务方法返回的数据。在下面给出的示例应用程序演练中,包含LINQ-to-SQL查询的WCF服务托管在IIS上,并使用控制台应用程序作为WCF客户端。
将LINQ-to-SQL集成到WCF服务中的应用程序开发涉及三个主要任务
- 创建托管在IIS上的WCF服务网站
- 配置WCF服务
- 使用SvcUtil.exe创建WCF控制台客户端
注意
本示例在网站的App_Data文件夹中使用SQL Server Express数据库文件Sales.mdf。此数据库包含“Product”表。在SQL Server 2005 Express中创建数据库文件和相关表不在本文的范围之内。假定读者对这些操作有先前的知识。
任务1:创建托管在IIS上的WCF服务网站
- 要在IIS上创建和托管WCF服务,请打开Visual Studio 2008,选择“文件”->“新建网站”->“WCF服务”;选择HTTP,并指定https:///MyLinqWcfServiceHost/作为位置,然后单击“确定”。这将创建一个新网站,项目文件存储在[驱动器:]\inetpub\wwwroot文件夹中。
- 向网站添加对System.Data.Linq.dll的引用。
- 如下修改IService.cs文件。请注意,类定义是在命名空间
MyWCFLinqService
下创建的。
Visual Studio在App_Code文件夹中生成两个文件:IService.cs和Service.cs。这两个文件分别包含WCF服务接口和实现该接口的类的定义。相应地修改这些文件以创建基于LINQ-to-SQL的WCF服务。
using System.Data.Linq;
using System.Data.Linq.Mapping;
namespace MyWCFLinqService
{
[ServiceContract]
public interface ILinqService
{
[OperationContract]
List<Product> GetProductList();
}
//...
在上面的代码中,ILinqService
是一个定义方法GetProductList
的接口。请注意,该类具有ServiceContract
属性以指定它在WCF中是一个服务契约,并且该方法具有OperationContract
属性以指示它是一个服务操作。该方法返回来自Product表的通用、类型化项目列表。为了使用数据库和表,使用了LINQ to SQL数据访问技术。
DataContext
类是一个LINQ to SQL类,它充当SQL Server数据库与映射到该数据库的LINQ to SQL实体类之间的通道。DataContext
类包含用于连接到数据库和操作数据库中数据的方法和属性。
DataContext
的Sales
类。它包括Product表的表定义和一个以连接字符串作为参数的构造函数。[DataContract]
public class Sales : DataContext
{
public Table<Product> Products;
public Sales(string connstr) : base(connstr)
{
}
}
您必须将DataContractAttribute
属性应用于由DataContractSerializer
在序列化和反序列化操作中使用的类型(类、结构或枚举)。Windows Communication Foundation (WCF) 基础设施通过使用DataContractAttribute
向持有和操作消息中发送的数据的任何类发送或接收消息。
为了访问数据库中的Product表,使用TableAttribute
属性将类指定为与数据库表关联的实体类。您还必须将DataMemberAttribute
应用于您希望序列化的任何字段、属性或事件。通过应用DataContractAttribute
,您显式启用DataContractSerializer
来序列化和反序列化数据。
[DataContract]
[Table(Name = "Product")]
public class Product
{
int prodid;
string prodname, desc;
[DataMember]
[Column(IsPrimaryKey = true, Storage = "prodid")]
public int productid
{
get { return prodid; }
set { prodid = value; }
}
[DataMember]
[Column(Storage = "prodname")]
public string productname
{
get { return prodname; }
set { prodname = value; }
}
[DataMember]
[Column(Storage = "desc")]
public string description
{
get { return desc; }
set { desc = value; }
}
}
ILinqService
”的类“LinqService
”。在实现GetProductList
方法时,编写一个检索Product表数据的LINQ查询。using MyWCFLinqService;
public class LinqService : ILinqService
{
public List<Product> GetProductList()
{
Sales db = new Sales(@"D:\MyLinqWCFServiceHost\App_Data\sales.mdf");
IEnumerable<Product> productlist = from prod in db.Products select prod;
return productlist.ToList();
}
}
任务2:配置WCF服务
在定义服务契约和数据契约定义之后,您需要配置服务以在运行时环境中激活和托管它,该环境创建它并控制其上下文和生命周期。通常,运行基本WCF服务涉及以下步骤
- 配置服务的基地址。
- 配置服务的终结点。
- 托管和打开服务。
- 编译并运行服务。
由于我们的WCF服务“LinqService”作为网站托管在IIS上,因此可以忽略步骤3和4。要配置基地址和终结点,请在Web.Config文件中添加以下元素
<system.serviceModel>
<services>
<service behaviorConfiguration="mexBehavior" name="LinqService">
<endpoint binding="wsHttpBinding"
bindingConfiguration="" name="myEndpoint"
contract="MyWCFLinqService.ILinqService">
</endpoint>
<host>
<timeouts closeTimeout="00:03:10" />
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
<behavior name="mexBehavior">
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
实际上,这里没有在配置中指定基地址,因为它采用了网站的默认URL位置。它对应于<host>
元素内的以下元素
<baseAddresses>
<add baseAddress="https:///MyLinqWcfServiceHost/Service"/>
</baseAddresses>
或者,您可以使用“工具”菜单中的“WCF SvcConfig Editor”命令,通过对话窗口更直观地设置配置。
现在,在Internet Explorer上构建并运行网站https:///MyLinqWcfServiceHost/Service.svc,您将看到以下输出
任务3:使用SvcUtil.exe创建WCF控制台客户端
在本演练中,创建了一个基于控制台的WCF客户端应用程序,它调用前两个步骤中创建的Linqservice。为WCF服务创建客户端应用程序需要以下步骤
- 获取服务终结点的服务契约、绑定和地址信息。
- 使用该信息创建WCF客户端。
- 调用操作。
- 关闭WCF客户端对象。
在项目文件夹中创建一个名为“MyComServiceConsoleClient”的控制台应用程序,如示例应用程序所示。
要在客户端应用程序中连接到服务,您需要获取服务契约的类型信息。通常,您可以通过使用ServiceModel元数据实用程序工具 (Svcutil.exe) 来完成此操作,该工具从服务下载元数据,将其转换为您选择语言的托管源代码文件,并创建一个客户端应用程序配置文件,您可以使用该文件来配置您的WCF客户端对象。
打开Visual Studio 2008命令窗口并将当前文件夹更改为控制台应用程序文件夹。在提示符下输入以下命令
>svcutil /language:cs /out:ServiceClient.cs /config:app.config
https:///MyLinqWcfServiceHost/Service.svc?wsdl
注意:SvcUtil.Exe位于[驱动器:]\program files\microsoft sdks\windows\v6.0a\bin文件夹中。此实用程序默认检查服务的签名程序集。要跳过此验证,您需要在命令提示符下发出以下命令
>Sn.exe –Vr “d:\program files\microsoft sdks\windows\v6.0a\bin\Svcutil.exe”
成功执行svcutil.exe命令后,上述两个文件ServiceClient.cs和app.config在应用程序文件夹中创建。
现在,切换到Visual Studio IDE,通过选择“项目”->“添加现有项”菜单,将这两个文件添加到控制台应用程序“MyComServiceConsoleClient”中。
添加对System.Runtime.Serialization.dll和System.ServiceModel.dll的引用。
- 在Program.cs中,添加以下代码以创建代理对象来调用服务操作。
class Program
{
static void Main(string[] args)
{
LinqServiceClient client = new LinqServiceClient();
client.Open();
MyWCFLinqService.Prod[] items=
(MyWCFLinqService.Product[]) client.GetProductList();
foreach (MyWCFLinqService.Product s in items)
Console.WriteLine("{0} is {1}", s.productid, s.productname );
client.Close();
Console.Read();
}
}
结论
基于LINQ to SQL查询的WCF服务已创建、配置并作为网站托管在IIS上。使用由SvcUtil.exe生成的代码和配置文件创建了一个控制台客户端应用程序来调用服务操作。