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

Я пытаюсь идти перед выполнением, но это просто походит на проверку...

7
задан marc_s 11 May 2010 в 05:01
поделиться

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
}

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

10
ответ дан 6 December 2019 в 19:34
поделиться

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

Programming WCF Services

3
ответ дан 6 December 2019 в 19:34
поделиться

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

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

0
ответ дан 6 December 2019 в 19:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: