Служба самостоятельного размещения WCF — конечные точки в C#

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

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

    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

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


person Kyle    schedule 11.05.2010    source источник
comment
Вы используете .NET 3.5 или .NET 4?? Функция создания конечных точек по умолчанию для базового адреса — это новая вещь в .NET 4, которая не будет работать в 3.5.   -  person marc_s    schedule 11.05.2010


Ответы (3)


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

  • прежде всего, это функция 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 - настоятельно рекомендуется.

person marc_s    schedule 11.05.2010
comment
Спасибо Марк, я обязательно проверю эти книги. Я нахожусь в неудачном положении, потому что пока не могу использовать .NET4, но спасибо также за ссылку на блог Криса, похоже, мне предстоит неплохое чтение. Вместо этого я рассматриваю возможность использования WebServiceHost, поскольку все, что мне действительно нужно сделать, это выполнить действие, запрошенное через HTTP-запрос GET, и вернуть небольшое количество данных. - person Kyle; 11.05.2010

Что касается книг, вот моя рекомендация: книга, которую я всегда рекомендую для быстрого запуска и работы в 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

person marc_s    schedule 11.05.2010

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

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

person Chris O    schedule 11.05.2010
comment
Спасибо, искал хорошие книги, посмотрю. - person Kyle; 11.05.2010