Служба данных WCF как библиотека - PullRequest
2 голосов
/ 26 октября 2011

Сегодня я копаюсь в Службе данных WCF, и у меня есть вопрос по этому поводу. Могу ли я создать Службу данных WCF как Библиотеку и просто создать Службу данных WCF только в нашем существующем веб-приложении и ссылаться на эту библиотеку, используя свойство Factory, чтобы служба развернулась с существующим веб-приложением.

Как я знаю, мы можем создать сервисную библиотеку WCF, и нам нужно только ссылаться на эту библиотеку в веб-приложении, например:

  1. Создание библиотеки WCF и реализация контракта на обслуживание
  2. Создайте веб-приложение и добавьте новый элемент в качестве файла службы Wcf, а затем воспользуйтесь библиотекой WCF

    <% @ ServiceHost Service = "MyServiceLibrary.MyService" Factory = "System.ServiceModel.Activation.WebServiceHostFactory" />

Вместо служебной библиотеки я хочу создать служебную библиотеку OData.

Спасибо

1 Ответ

3 голосов
/ 27 октября 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Среда выполнения Data Service для вас.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...