Как реализовать Сеансы данных WCF с собственными хостами (http://localhost: 1234/myDataService.svc/...)

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

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

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

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

Ответ 1

Я просто попробовал то же самое - и да, вы можете разместить службу данных 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 для вас.

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

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