如何实现自托管 WCF 数据服务(http://localhost:1234/myDataService.svc/...)

Posted

技术标签:

【中文标题】如何实现自托管 WCF 数据服务(http://localhost:1234/myDataService.svc/...)【英文标题】:How to implement Self-host WCF data services (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。 (因为他出色的答案为我节省了大量时间。)赏金不需要新的答案。 【参考方案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)。在分期中,将所有内容托管在同一个网站上。

以上是关于如何实现自托管 WCF 数据服务(http://localhost:1234/myDataService.svc/...)的主要内容,如果未能解决你的问题,请参考以下文章

在 WCF 自托管服务中指定 Singleton 服务

IIS托管WCF服务:集成测试和代码覆盖

具有 CORS 和基本身份验证支持的 WCF 自托管数据服务

如何让我的自托管 WCF 服务不尝试保留 localhost 以外的 url?

选择使用 IIS 进行 WCF 服务托管或使用 Windows 服务进行自托管

受 SSL 保护的 RESTFul WCF 自托管服务