11

我有一个项目需要实现 WCF 数据服务 (OData) 以从控制系统(.NET Framework 应用程序)中检索数据。WCF 数据服务需要由 .NET 应用程序托管(无 ASP.NET 和无 IIS)。

我最近看到了很多 WCF 数据服务示例;它们都由 ASP.NET 应用程序托管。我还看到了自主机(控制台应用程序)示例,但它适用于 WCF 服务(不是 WCF 数据服务)。

可以有一个独立的 .NET 应用程序来托管 WCF 数据服务 (http://localhost:1234/mydataservice.svc/...)。

如果是,有人可以提供一个例子吗?

4

1 回答 1

28

我只是尝试了同样的事情——是的,您可以在自己的程序集中托管 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;
            }
        }
    }
    

    您可以为该类命名任何您喜欢的名称,它必须从您的数据模型的名称派生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();
                }
            }
        }
    }
    

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

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

    MyDataServiceHost.LaunchDataService("http://localhost:4444/YourService");
    
  • 最后要记住的事情:用于启动 WCF 数据服务的应用程序必须在其 app.config(或 web.config)中包含连接字符串(EDM 连接字符串,如果您使用的是实体框架),以便执行此操作去工作!

于 2010-06-15T05:09:34.830 回答