Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Чтобы разместить службу внутри управляемого приложения, внедрить код службы в управляемый код приложения, определите конечную точку службы либо императивно в коде, декларативно с помощью конфигурации, либо с помощью конечных точек по умолчанию, а затем создайте экземпляр ServiceHost.
Чтобы начать получать сообщения, вызовите Open по ServiceHost. При этом создается и открывается прослушиватель для службы. Размещение службы таким образом часто называется "самостоятельным размещением", так как управляемое приложение выполняет сам процесс размещения. Чтобы закрыть службу, вызовите CommunicationObject.Close на ServiceHost.
Кроме того, служба может размещаться в управляемой службе Windows, в службах IIS или в службе активации процесса Windows (WAS). Дополнительные сведения о вариантах размещения службы см. в разделе Hosting Services.
Размещение службы в управляемом приложении является наиболее гибким вариантом, так как для развертывания требуется минимальная инфраструктура. Дополнительные сведения о размещении служб в управляемых приложениях см. в разделе Размещение в управляемом приложении.
В следующей процедуре показано, как реализовать локальную службу в консольном приложении.
Создание локальной службы
Создайте консольное приложение:
Откройте Visual Studio и выберите Новый>проект из меню "Файл".
В списке установленных шаблонов выберите Visual C# или Visual Basic, а затем выберите Windows Desktop.
Выберите шаблон консольного приложения. Введите
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Примечание.
Дополнительные сведения о том, как определить и реализовать интерфейс службы, см. в статье How to: Define a Service Contract and How to: Implement a Service Contract.
В верхней части метода
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 {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 CTRL+SHIFT+B, чтобы создать решение.
Тестирование службы
Чтобы запустить службу, нажмите клавиши CTRL+F5.
Откройте тестовый клиент WCF .
Подсказка
Чтобы открыть тестового клиента WCF, откройте Командную строку разработчика для Visual Studio и выполните WcfTestClient.exe.
Выберите Добавить службу в меню файла.
Введите
http://localhost:8080/helloв адресное поле и нажмите кнопку ОК.Подсказка
Убедитесь, что служба запущена, иначе этот шаг завершится ошибкой. Если вы изменили базовый адрес в коде, используйте измененный базовый адрес на этом шаге.
Дважды щелкните SayHello в разделе My Service Projects. Введите имя в столбец значения в списке запрос и щелкните "Вызвать".
В списке ответов появится сообщение ответа.
Пример
В следующем примере создается объект 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 {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)
- использование привязок для настройки служб и клиентов
- System-Provided Связи