简体   繁体   中英

WCF Data Service vs. WCF Service Library

我注意到我无法将WCF数据服务(.svc文件)添加到Visual Studio 2010中的WCF服务库项目。我对WCF有点陌生,并想知道我应该如何/为什么要将我的WCF数据服务放入其中自己组装。

Yes, you can host a WCF Data Service in your own assembly - with a few little tricks. Doing so makes your solution cleaner - it separates the various pieces into more manageable bits, so I would definitely recommend doing this.

Here's how:

  • put your data model (EF Data Model) into its own assembly, let's call it DataModel

  • create a new class library project (call it MyDataServiceHost )

  • add a few references:

    • your DataModel assembly with the data layer
    • System.ServiceModel
    • System.ServiceModel.Web
    • System.Data.Services.Client
    • System.Data.Services - you cannot pick this from the usual Add Reference dialog under the .NET category - you need to browse for the assembly file. Find the directory C:\\Program Files\\Reference Assemblies\\Microsoft\\Framework\\.NETFramework\\v4.0 (or C:\\Program Files (x86)\\... on a 64-bit machine) and pick the System.Data.Services.dll inside it
  • add a new class to that class library and call it eg YourDataService.cs - it will look something like this:

     using System.Data.Services; using System.Data.Services.Common; using DataModel; namespace MyDataServiceHost { public class YourDataService : DataService<YourModelEntities> { // This method is called only once to initialize service-wide policies. public static void InitializeService(DataServiceConfiguration config) { // TODO: set rules to indicate which entity sets and service operations are visible, updatable, etc. // Examples: config.SetEntitySetAccessRule("*", EntitySetRights.AllRead); config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2; } } } 

    You can name the class anything you like, and it has to derive from DataService<T> where T is the name of your data model; if you're using Entity Framework, it's the name of your object context class - typically something like (database)Entities or whatever you picked when you created the EDM

  • add another class to your new project, call it MyDataServiceHost.cs and it will look something like this:

     using System; using System.Data.Services; using DataModel; namespace MyDataServiceHost { public class MyDataServiceHost { public static void LaunchDataService(string baseAddress) { Uri[] baseAddresses = new Uri[1]; baseAddresses[0] = new Uri(baseAddress); using(DataServiceHost host = new DataServiceHost(typeof(YourDataService), baseAddresses)) { host.Open(); Console.WriteLine("DataService up and running....."); Console.ReadLine(); host.Close(); } } } } 

    It instantiates a DataServiceHost, which is derived from WebServiceHost (which in turn is derived from ServiceHost) and it will spin up the WCF Data Service runtime for you.

  • now you can start up your WCF Data Service from any app using:

     MyDataServiceHost.LaunchDataService("http://localhost:4444/YourService"); 
  • last thing to remember: the app that you use to launch the WCF Data Service must have the connection string (the EDM connection string, if you're using Entity Framework) in its app.config (or web.config ) in order for this to work!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM