Как реализовать службы данных WCF с собственным хостом (http://localhost:1234/myDataService.svc/...) - PullRequest
11 голосов
/ 15 июня 2010

У меня есть проект, который должен реализовать службы данных WCF (OData) для извлечения данных из системы управления (.NET Framework Application). Служба данных WCF должна размещаться в приложении .NET (без ASP.NET и без IIS).

Я недавно видел много примеров Службы данных WCF; все они размещены в приложении ASP.NET. Я также вижу примеры с собственным хостом (консольное приложение), но это для службы WCF (не службы данных WCF).

Можно иметь отдельные приложения .NET для размещения служб данных WCF (http: //localhost:1234/mydataservice.svc / ...).

Если да, может кто-нибудь привести пример?

1 Ответ

28 голосов
/ 15 июня 2010

Я только что попробовал то же самое - и да, вы можете разместить Службу данных 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 - это имя вашегомодель данных;если вы используете Entity Framework, это имя вашего класса контекста объекта - обычно что-то вроде (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();
                }
            }
        }
    }
    

    Он создает экземпляр DataServiceHost, который является производным от WebServiceHost (который, в свою очередь, является производным от ServiceHost), и он раскручивает WCFСреда выполнения Data Service для вас.

  • теперь вы можете запустить службу данных WCF из любого приложения, используя:

    MyDataServiceHost.LaunchDataService("http://localhost:4444/YourService");
    
  • Последнее, что нужно сделатьпомните: приложение, которое вы используете для запуска службы данных WCF , должно иметь строку подключения (строку подключения EDM, если вы используете Entity Framework) в своем файле app.config (или web.config) вчтобы это работало!

...