【问题标题】:WCF Data Service as LibraryWCF 数据服务作为库
【发布时间】:2011-10-26 18:24:42
【问题描述】:

今天我正在研究 WCF 数据服务,对此我有一个疑问。我可以将 WCF 数据服务创建为库,并且只在我们现有的 Web 应用程序中创建 WCF 数据服务并使用工厂属性引用该库,以便服务将与现有的 Web 应用程序一起部署。

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

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

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

谢谢

【问题讨论】:

  • 我不明白为什么这不起作用 - 你试过了吗?
  • 我实现了 WCF 库并且它正在工作,但我的问题是 WCF 数据服务 (OData),因为它的实现不同。所以我想知道,是否有可能以同样的方式?
  • 我还没有使用过 WCF 数据服务,但正如我所说,它似乎应该可以工作。我建议尝试一下,看看会发生什么。

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


【解决方案1】:

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

方法如下:

  • 把你的数据模型(EF Data Model)放到自己的程序集中,我们称之为DataModel

  • 新建一个类库项目(命名为MyDataServiceHost

  • 添加一些参考:

    • 您的 DataModel 与数据层的程序集
    • System.ServiceModel
    • System.ServiceModel.Web
    • System.Data.Services.Client
    • System.Data.Services - 您不能从 .NET 类别下的常用 Add Reference 对话框中选择它 - 您需要浏览程序集文件。找到目录C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.0(或C:\Program Files (x86)\...在64位机器上)并选择其中的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&lt;T&gt;派生,其中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();
                }
            }
        }
    }
    

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

  • 现在您可以使用以下方式从任何应用程序启动 WCF 数据服务:

    MyDataServiceHost.LaunchDataService("http://localhost:4444/YourService");
    
  • 要记住的最后一件事:用于启动 WCF 数据服务的应用程序必须在其app.config(或 web.config)才能正常工作!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2023-03-26
    相关资源
    最近更新 更多