Создать службу данных WCF для использования в хосте службы - PullRequest
4 голосов
/ 22 января 2011

У меня есть приложение-служба, которое размещает несколько конечных точек WCF через разные привязки. Теперь я хочу разместить службу данных WCF на том же хосте службы. Этот пост заставляет меня поверить, что это возможно. Однако каждый отдельный пример создания службы данных WCF создает ее из веб-проекта ASP.NET, а не из библиотеки классов или приложения-службы. На самом деле Служба данных WCF даже не отображается в Добавить новый элемент, если выбран один из этих типов проектов.
Мой вопрос: как мне создать Службу данных WCF внутри библиотеки классов, которая будет вызываться узлом службы, на котором уже размещены несколько других конечных точек WCF? Ссылка , на которую я уже ссылался, показывает, как разместить Службу данных после ее создания, но, поскольку она не отображается в качестве опции Добавить новый элемент, я застрял в кинне.

Ответы [ 3 ]

7 голосов
/ 22 января 2011

Да, вы можете разместить службу данных 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) в своем приложении .config (или web.config), чтобы это работало!

0 голосов
/ 22 января 2011

После долгих копаний я нашел ответ на этот пост: http://social.msdn.microsoft.com/Forums/en/adodotnetdataservices/thread/3191377e-f3f9-4d46-8daf-431cf74cef7c
Мне нужно использовать класс DataService<T>, передавая мой ObjectContext, который содержит все мои сущности. Работал отлично

0 голосов
/ 22 января 2011

Один из способов добиться этого - создать проект ASP.NET, содержащий службу данных WCF, а затем определить хост пользовательской службы данных (прокрутите вниз до пункта «Определение пользовательских данных»Раздел «Узел службы»), который выступает посредником между существующим узлом WCF и Службой данных.

...