Служба собственного размещения WCF - конечные точки в C # - PullRequest
7 голосов
/ 11 мая 2010

Мои первые несколько попыток создания собственного сервиса. Попытка создать что-то, что будет принимать строку запроса и возвращать некоторый текст, но у него есть несколько проблем:

  • Вся документация говорит о том, что конечные точки создаются автоматически для каждого базового адреса, если они не найдены в файле конфигурации. Мне кажется, это не так, я получаю исключение "Служба имеет нулевые конечные точки приложения ...". Ручное указание базовой конечной точки, как показано ниже, похоже, решает эту проблему:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.ServiceModel;
    using System.ServiceModel.Description;
    
    namespace TestService
    {
        [ServiceContract]
        public interface IHelloWorldService
        {
           [OperationContract]
           string SayHello(string name);
        }
    
        public class HelloWorldService : IHelloWorldService
        {
            public string SayHello(string name)
            {
               return string.Format("Hello, {0}", name);
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                string baseaddr = "http://localhost:8080/HelloWorldService/";
                Uri baseAddress = new Uri(baseaddr);
    
                // Create the ServiceHost.
                using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
                {
                    // Enable metadata publishing.
                    ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
                    smb.HttpGetEnabled = true;
                    smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15;
                    host.Description.Behaviors.Add(smb);
    
                    host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), baseaddr);
                    host.AddServiceEndpoint(typeof(IHelloWorldService), new BasicHttpBinding(), baseaddr + "SayHello");
    
                    //for some reason a default endpoint does not get created here
                    host.Open();
    
                    Console.WriteLine("The service is ready at {0}", baseAddress);
                    Console.WriteLine("Press <Enter> to stop the service.");
                    Console.ReadLine();
    
                    // Close the ServiceHost.
                    host.Close();
                }
             }
         }
    }
    
  • Как мне настроить этот параметр, чтобы он возвращал значение имени в SayHello (имя строки), когда запрашивается таким образом: localhost: 8080 / HelloWorldService / SayHello? Name = kyle

Я пытаюсь идти перед бегом, но это похоже на ползание ...

Ответы [ 3 ]

10 голосов
/ 11 мая 2010

На вопрос о том, какие конечные точки по умолчанию не добавляются:

  • Прежде всего, это функция WCF 4 - она ​​будет работать только на .NET 4
  • затем, конечные точки по умолчанию добавляются на ваш сервисный хост, только если у вас нет явных конечных точек, определенных в конфигурации, и если вы не добавляете конечные точки самостоятельно в коде ! Добавляя эти две конечные точки в код, вы берете на себя ответственность, и среда выполнения WCF 4 не будет зависеть от вашей конфигурации

Ознакомьтесь с этой статьей библиотеки MSDN для получения дополнительной информации о Что нового в WCF 4 для разработчиков . Он показывает, среди прочего, как использовать конечные точки по умолчанию - вы в основном определяете базовый адрес для вашей службы и открываете ServiceHost - и все!

string baseaddr = "http://localhost:8080/HelloWorldService/";
Uri baseAddress = new Uri(baseaddr);

// Create the ServiceHost.
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
   //for some reason a default endpoint does not get created here
   host.Open();

   // here, you should now have one endpoint for each contract and binding
}

Вы также можете явно добавить конечные точки по умолчанию в коде, если вы хотите это сделать. Поэтому, если вам нужно добавить свои собственные конечные точки, но затем вы хотите добавить системные конечные точки по умолчанию, вы можете использовать:

// define and add your own endpoints here

// Create the ServiceHost.
using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))
{
   // add all the system default endpoints to your host
   host.AddDefaultEndpoints();

   //for some reason a default endpoint does not get created here
   host.Open();

   // here, you should now have your own endpoints, plus 
   // one endpoint for each contract and binding
}

Я также хотел бы, чтобы этот пост был здесь , чтобы он был достаточно ярким - блог Кристофера полон хороших и очень полезных сообщений WCF - настоятельно рекомендуется.

3 голосов
/ 11 мая 2010

Что касается книг - вот моя рекомендация: книга, которую я всегда рекомендую быстро приступить к работе в WCF, - Изучение WCF Мишелем Леру Бустаманте. Она охватывает все необходимые темы и очень понятным и доступным способом. Это научит вас всему - основам, промежуточным темам, безопасности, управлению транзакциями и т. Д. - что вам необходимо знать, чтобы писать высококачественные и полезные службы WCF.

Обучение WCF http://ecx.images -amazon.com / images / I / 41wYa% 2BNiPML._BO2,204,203,200_PIsitb-sticker-arrow-click, TopRight, 35, -76_AA240_SH20_OU01_.jpg

Более сложные темы и более глубокий взгляд на WCF будут освещены Программирование служб WCF Ювала Лоуи. Он действительно углубляется во все технические детали и темы и представляет «библию» для программирования WCF.

Программирование служб WCF http://ecx.images -amazon.com / images / I / 41H2u13a9bL._BO2,204,203,200_PIsitb-sticker-arrow-click, TopRight, 35, -76_AA240_SH20_OU01_.jpg

0 голосов
/ 11 мая 2010

Если IIS размещает ваш веб-сервис, вы получаете дружественную страницу «вы создали веб-сервис», предполагая, что больше ничего не случилось. Возможно, вы захотите попробовать несколько быстрых учебных пособий по WCF, которые можно найти в книге Бустаменте по обучению WCF, они быстро идут и многое объясняют.

РЕДАКТИРОВАТЬ: Вот страница MSDN , которая показывает один из способов получить параметры строки запроса из вашего запрошенного вызова службы, хороший пример. Он показывает использование атрибута [WebGet]. Если вы не хотите использовать это, вы можете попробовать использовать OperationContext , чтобы получить внутреннюю часть входящего запроса.

...