【问题标题】:How to implement Self-host WCF data services (http://localhost:1234/myDataService.svc/...)如何实现自托管 WCF 数据服务(http://localhost:1234/myDataService.svc/...)
【发布时间】:2011-03-03 19:42:11
【问题描述】:

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

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

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

如果是,有人可以举个例子吗?

【问题讨论】:

  • 你试过了吗?您是否能够自行托管正常的 WCF 服务?
  • 赏金将在时间限制结束后转到marc_s。 (因为他出色的答案为我节省了大量时间。)赏金不需要新的答案。

标签: wcf service odata hosting


【解决方案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(或在 64 位机器上为 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&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)为了使它工作!

【讨论】:

  • 如果你还在看这个问题,我按照你的回答让服务运行了,但是当我尝试在 Firefox 中像这样查看它时:localhost:4444/EntitySearch/Countries我得到了这个结果:Resource not found for the segment 'Countries'.我仔细检查了我的 EF 代码,那里有那个类('public ObjectSet Country')有什么想法吗?
  • 我拼错了“InitializeService”方法名称。 (Grr,应该只是复制和粘贴。)
  • 我建议安装 WCF 数据服务服务器 NuGet 包,而不是导航到本地程序集以引用 System.Data.Services。
  • 我在 VS2012 中有 3 个项目:WCF Service Host、ASP.NET WEB API 和 WCF DataService输出路径相同 MyServices\bin\Debug 文件夹为所有 3. 在开发中,有用的自托管每个项目。无论如何,Web.config 对所有 3 个项目都是通用的。现在,是否可以 在同一个 IIS 网站中托管所有 3 个项目结论开发中,自托管(WCF、WCFDataService、WebAPI)。在分期中,将所有内容托管在同一个网站上。
猜你喜欢
  • 2012-07-06
  • 2012-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多