WCF数据服务作为库

时间:2011-10-26 18:24:42

标签: asp.net wcf linq-to-sql odata

今天我正在深入研究WCF数据服务,我对此有疑问。我可以创建WCF数据服务作为库,只在我们现有的Web应用程序中创建WCF数据服务,并使用Factory属性引用该库,因此服务将使用现有的Web应用程序进行部署。

据我所知我们可以创建WCF服务库,只需要在Web应用程序中引用该库,如:

  1. 创建WCF库并实施服务合同
  2. 创建Web应用程序并将新项目添加为Wcf服务文件,然后参考WCF库

    <%@ ServiceHost Service =“MyServiceLibrary.MyService”Factory =“System.ServiceModel.Activation.WebServiceHostFactory”/>

  3. 我想创建OData服务库而不是服务库。

    由于

1 个答案:

答案 0 :(得分:3)

是的,您可以在自己的程序集中托管WCF数据服务 - 只需一些小技巧。我刚刚研究了这个,并提出了这些步骤/说明。

以下是:

  • 将您的数据模型(EF数据模型)放入自己的程序集中,我们称之为DataModel

  • 创建一个新的类库项目(称之为MyDataServiceHost

  • 添加一些参考文献:

    • 您的DataModel程序集与数据层
    • System.ServiceModel
    • System.ServiceModel.Web
    • System.Data.Services.Client
    • System.Data.Services - 您无法从.NET类别下的常用Add Reference对话框中选择此项 - 您需要浏览汇编文件。在64位计算机上找到目录C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0(或C:\Program Files (x86)\...)并选择其中的System.Data.Services.dll
  • 为该类库添加一个新类并调用它,例如YourDataService.cs - 它看起来像这样:

    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;
            }
        }
    }
    

    您可以根据自己喜欢的名称命名该类,并且必须从DataService<T>派生,其中T是您的数据模型的名称;如果您正在使用实体框架,那么它就是您的对象上下文类的名称 - 通常类似(database)Entities或您在创建EDM时选择的任何内容

  • 在新项目中添加另一个类,称之为MyDataServiceHost.cs,它看起来像这样:

    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();
                }
            }
        }
    }
    

    它实例化一个DataServiceHost,它派生自WebServiceHost(后者又派生自ServiceHost),它将为您启动WCF数据服务运行时。

  • 现在您可以使用以下任意应用启动您的WCF数据服务:

    MyDataServiceHost.LaunchDataService("http://localhost:4444/YourService");
    
  • 要记住的最后一件事:用于启动WCF数据服务的应用必须具有连接字符串(EDM连接字符串,如果您使用的是实体框架) app.config(或web.config)以使其正常工作!