【问题标题】:WCF Data Service vs. WCF Service LibraryWCF 数据服务与 WCF 服务库
【发布时间】:2011-11-13 21:06:41
【问题描述】:

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

【问题讨论】:

  • WCF 数据服务只能添加到 Web 应用程序(也可能是“网站”)项目中 - 至少使用 Visual Studio 模板......跨度>

标签: c# wcf web-services


【解决方案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)才能正常工作!

【讨论】:

  • 是的,我在之前的帖子中看到了这个stackoverflow.com/questions/4768145/… 这会创建 svc 文件吗?
  • @Ryan: 不 - 不需要 *.svc 文件,因为您自己创建了 DataServiceHost 并在代码中定义了可以访问您的服务的基地址 - 没有任何意义 * .svc 文件
  • 感谢您的信息!我不确定这是不是我想走的路。
  • @marc_c 实际上这样做和只创建 WCF 服务应用程序有什么区别?
  • @Ryan: WCF Data 服务是 1) 基于 REST 的服务(服务应用程序中的“普通”WCF 服务是基于 SOAP ),以及 2) WCF 数据服务具有许多常规的基本 WCF 服务所没有的附加功能
猜你喜欢
  • 2012-01-14
  • 2011-04-22
  • 2011-01-29
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 2011-03-02
相关资源
最近更新 更多