创建WCF数据服务以在服务主机中使用

Pas*_*cal 4 hosting wcf wcf-data-services

我有一个服务应用程序,通过不同的绑定托管几个WCF端点.我现在想要在同一个服务主机中托管WCF数据服务.这篇文章让我相信这是可能的.但是,有关如何创建WCF数据服务的每个示例都是从ASP.NET Web项目内部创建的,而不是类库或服务应用程序.实际上,当从其中一个项目类型中选择时,WCF数据服务甚至不会显示在"添加新项"中.
我的问题是如何在类库中创建一个WCF数据服务,它将由服务主机调用,该服务主机已经托管了其他几个WCF端点?我已经引用的链接向我展示了如何在创建数据服务之后托管数据服务,但由于它没有显示为添加新项目的选项,所以我是kinna卡住了.

mar*_*c_s 7

是的,您可以在自己的程序集中托管WCF数据服务 - 只需一些小技巧.

这是如何做:

  • 将您的数据模型(EF Data Model)放入自己的程序集中,让我们调用它 DataModel

  • 创建一个新的类库项目(调用它MyDataServiceHost)

  • 添加一些参考:

    • DataModel的数据层组装
    • System.ServiceModel
    • System.ServiceModel.Web
    • System.Data.Services.Client
    • System.Data.Services- 您无法从Add Reference.NET类别下的常用对话框中选择此项- 您需要浏览汇编文件.找到目录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;
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    您可以将类命名为任何你喜欢的,它具有从派生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();
                }
            }
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 现在,您可以使用以下命令从任何应用启动WCF数据服务:

    MyDataServiceHost.LaunchDataService("http://localhost:4444/YourService");
    
    Run Code Online (Sandbox Code Playgroud)
  • 最后要记住的事情:用于启动WCF数据服务的应用程序必须在其app.config(或web.config)中具有连接字符串(EDM连接字符串,如果您使用的是Entity Framework)上班!