Практическое руководство. Размещение службы WCF в управляемом приложении
Для размещения службы внутри управляемого приложения внедрите код службы внутрь кода управляемого приложения, определите конечную точку для службы императивно в коде, декларативно с помощью конфигурации или посредством конечных точек по умолчанию, а затем создайте экземпляр класса ServiceHost.
Чтобы начать принимать сообщения, вызовите метод Open для ServiceHost. При этом создается и открывается прослушиватель для этой службы. Такое размещение службы часто называется "резидентным", так как управляемое приложение самостоятельно выполняет функции ведущего приложения. Чтобы закрыть службу, вызовите метод CommunicationObject.Close для ServiceHost.
Служба может также размещаться в управляемой службе Windows, в службах IIS или в службе активации процесса Windows (WAS). Дополнительные сведения о вариантах размещения службы см. в разделе "Службы размещения".
Размещение служб в управляемом приложении - самый гибкий вариант размещения, так как в этом случае требуется минимальное развертывание инфраструктуры. Дополнительные сведения о размещении служб в управляемых приложениях см. в разделе "Размещение в управляемом приложении".
В следующей процедуре показано, как реализовать резидентную службу в консольном приложения.
Создание локальной службы
Создайте консольное приложение:
Откройте Visual Studio и выберите "Создать>проект" в меню "Файл".
В списке установленных шаблонов выберите Visual C# или Visual Basic, а затем выберите "Рабочий стол Windows".
Выберите шаблон консольного приложения . Введите
SelfHost
поле "Имя" и нажмите кнопку "ОК".
Щелкните правой кнопкой мыши SelfHost в Обозреватель решений и выберите "Добавить ссылку". Выберите System.ServiceModel на вкладке .NET и нажмите кнопку "ОК".
Совет
Если окно Обозреватель решений не отображается, выберите Обозреватель решений в меню "Вид".
Дважды щелкните Program.cs или Module1.vb в Обозреватель решений, чтобы открыть его в окне кода, если он еще не открыт. Добавьте следующие инструкции в начало файла .
using System.ServiceModel; using System.ServiceModel.Description;
Imports System.ServiceModel Imports System.ServiceModel.Description
Определите и реализуйте контракт службы. В этом примере определяется служба
HelloWorldService
, которая возвращает сообщение на основании входных данных, передаваемых службе.[ServiceContract] public interface IHelloWorldService { [OperationContract] string SayHello(string name); } public class HelloWorldService : IHelloWorldService { public string SayHello(string name) { return string.Format("Hello, {0}", name); } }
<ServiceContract()> Public Interface IHelloWorldService <OperationContract()> Function SayHello(ByVal name As String) As String End Interface Public Class HelloWorldService Implements IHelloWorldService Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello Return String.Format("Hello, {0}", name) End Function End Class
Примечание.
Дополнительные сведения о том, как определить и реализовать интерфейс службы, см. в разделе "Практическое руководство. Определение контракта службы и практическое руководство. Реализация контракта службы".
В начале метода
Main
создайте экземпляр класса Uri с базовым адресом для службы.Uri baseAddress = new Uri("http://localhost:8080/hello");
Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
Создайте экземпляр класса ServiceHost, передав Type, представляющий тип службы, и универсальный код ресурса (URI) базового адреса в метод ServiceHost(Type, Uri[]). Включите публикацию метаданных и вызовите метод Open в ServiceHost, чтобы инициализировать службу и подготовить ее к приему сообщений.
// 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); // Open the ServiceHost to start listening for messages. Since // no endpoints are explicitly configured, the runtime will create // one endpoint per base address for each service contract implemented // by the service. 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(); }
' Create the ServiceHost. Using host As New ServiceHost(GetType(HelloWorldService), baseAddress) ' Enable metadata publishing. Dim smb As New ServiceMetadataBehavior() smb.HttpGetEnabled = True smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15 host.Description.Behaviors.Add(smb) ' Open the ServiceHost to start listening for messages. Since ' no endpoints are explicitly configured, the runtime will create ' one endpoint per base address for each service contract implemented ' by the service. 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() End Using
Примечание.
В этом примере используются конечные точки по умолчанию, и для данной службы не требуется файл конфигурации. Если конечные точки не настроены, то среда выполнения создает одну конечную точку для каждого базового адреса в каждом контракте службы, реализованном в службе. Дополнительные сведения о конечных точках по умолчанию см. в разделе "Упрощенная конфигурация" и "Упрощенная конфигурация" для служб WCF.
Нажмите клавиши CTRL+SHIFT+B, чтобы создать решение.
Тестирование службы
Нажмите клавиши CTRL+F5, чтобы запустить службу.
Откройте тестовый клиент WCF.
Совет
Чтобы открыть тестовый клиент WCF, откройте командную строку разработчика для Visual Studio и выполните WcfTestClient.exe.
Выберите " Добавить службу " в меню "Файл ".
Введите
http://localhost:8080/hello
в адресное поле и нажмите кнопку "ОК".Совет
Убедитесь, что служба запущена. В противном случае проверка дает отрицательный результат на этом этапе. Если базовый адрес в коде был изменен, используйте на этом этапе измененный базовый адрес.
Дважды щелкните SayHello в узле "Мои проекты служб". Введите имя в столбец "Значение " в списке запросов и нажмите кнопку "Вызвать".
В списке ответов появится сообщение ответа .
Пример
В следующем примере создается объект ServiceHost для размещения службы типа HelloWorldService
, затем вызывается метод Open для ServiceHost. Базовый адрес предоставляется в коде, включена публикация метаданных и используются конечные точки по умолчанию.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Description;
namespace SelfHost
{
[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)
{
Uri baseAddress = new Uri("http://localhost:8080/hello");
// 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);
// Open the ServiceHost to start listening for messages. Since
// no endpoints are explicitly configured, the runtime will create
// one endpoint per base address for each service contract implemented
// by the service.
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();
}
}
}
}
Imports System.ServiceModel
Imports System.ServiceModel.Description
Module Module1
<ServiceContract()>
Public Interface IHelloWorldService
<OperationContract()>
Function SayHello(ByVal name As String) As String
End Interface
Public Class HelloWorldService
Implements IHelloWorldService
Public Function SayHello(ByVal name As String) As String Implements IHelloWorldService.SayHello
Return String.Format("Hello, {0}", name)
End Function
End Class
Sub Main()
Dim baseAddress As Uri = New Uri("http://localhost:8080/hello")
' Create the ServiceHost.
Using host As New ServiceHost(GetType(HelloWorldService), baseAddress)
' Enable metadata publishing.
Dim smb As New ServiceMetadataBehavior()
smb.HttpGetEnabled = True
smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15
host.Description.Behaviors.Add(smb)
' Open the ServiceHost to start listening for messages. Since
' no endpoints are explicitly configured, the runtime will create
' one endpoint per base address for each service contract implemented
' by the service.
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()
End Using
End Sub
End Module
См. также
- Uri
- AppSettings
- ConfigurationManager
- Практическое руководство. Размещение службы WCF в IIS
- Резидентное размещение
- Размещение служб
- Практическое руководство. Определение контракта службы
- Практическое руководство. Реализация контракта службы
- Служебная программа для метаданных ServiceModel (Svcutil.exe)
- Использование привязок для настройки служб и клиентов
- Привязки, предоставляемые системой