Можно ли создать ретранслятор служебной шины Azure с помощью приложения службы Windows?

У меня есть приложение ретрансляции служебной шины Windows, работающее в консольном приложении. Изначально я создал консольное приложение для тестирования. Теперь у меня есть требование преобразовать это консольное приложение в службу Windows. Во всей документации Azure показаны только примеры с консольным приложением.

Есть ли способ создать приложение ретрансляции служебной шины с помощью службы Windows, чтобы на моей стороне клиента мне не нужно было запускать это консольное приложение (в виде командной строки).

Я пытаюсь подключить облачное приложение к корпоративной/защищенной сети.


Создано новое веб-приложение MVC для связи со службой ретрансляции. Не уверен, что мне не хватает. Есть ли какие-либо изменения, которые мне нужно внести в файл конфигурации «MyRelayTestService».

using Microsoft.ServiceBus;
using System.ServiceModel;
using System.Web.Mvc;
using WCFRelay;

namespace TestRelayApplication.Controllers
{
    public class HomeController : Controller
    {
        static ChannelFactory<IRelayTestChannel> channelFactory;

        public ActionResult Index()
        {
            var tcpbinding = new NetTcpRelayBinding();
                    channelFactory = new   ChannelFactory<IRelayTestChannel>(tcpbinding, "yourServiceNamespace");
            channelFactory.Endpoint.Behaviors.Add(new   TransportClientEndpointBehavior
            {
                TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", "yourKey")
            });
            using (IRelayTestChannel channel = channelFactory.CreateChannel())
            {

                var testStr = channel.DoWork();  // error on this call           
            }

            return View();
        }
    }
}

Ошибка:


person user2995902    schedule 27.04.2017    source источник
comment
Если это полезно, пожалуйста, отметьте это, это поможет большему количеству сообществ, у которых есть такая же проблема.   -  person Tom Sun - MSFT    schedule 01.05.2017
comment
Конечно. Сегодня я начал реализовывать этот код. Позвольте мне выполнить все шаги, а затем я отмечу как ответ.   -  person user2995902    schedule 16.05.2017


Ответы (2)


Можно ли создать ретранслятор служебной шины Azure с помощью приложения службы Windows?

Да, мы можем сделать это с помощью службы Windows. Я делаю демо для него. Ниже приведены мои подробные шаги.

1. Создайте пространство имен Relay с помощью портала Azure. Дополнительные сведения можно получить по адресу официальный документ. И создайте ретранслятор WCF на портале Azure.

введите здесь описание изображения

2. Первый модуль: сервисная библиотека WCF (WCFRelay.dll)

Определение сервисного контракта

  [ServiceContract]
    public interface IRelayTest
    {
        [OperationContract]
        string DoWork();
    }

Реализация сервисного контракта

public class RelayTest : IRelayTest
    {
        public string DoWork()
        {
            return "hello";
        }
    }

введите здесь описание изображения

  1. Второй модуль: создание службы WCF Relay Windows и ссылка на созданную WCFRelay.dll

введите здесь описание изображения

  1. Реализуйте OnStart и OnStop для службы.

    общедоступный частичный класс MyRelayTestService: ServiceBase { ServiceHost m_svcHost = новый ServiceHost (typeof (RelayTest)); public MyRelayTestService() { InitializeComponent(); }

        protected override void OnStart(string[] args)
        {
           // m_svcHost?.Close();
            ServiceHost sh = new ServiceHost(typeof(RelayTest));
            var binding = new WebHttpRelayBinding {IsDynamic = false};
            var serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public);
            sh.AddServiceEndpoint(
               typeof(IRelayTest), binding,
               ServiceBusEnvironment.CreateServiceUri("sb", "namespace", "path")) //tomtestrelay , testtom
                .Behaviors.Add(
                new TransportClientEndpointBehavior
                {
    
                    TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", "Key value")
                }
                );
    
            sh.Open();
        }
    
        protected override void OnStop()
        {
            if (m_svcHost == null) return;
            m_svcHost.Close();
            m_svcHost = null;
        }
    }
    

    5.Добавление установщика в Сервис

    введите здесь описание изображения

Добавьте следующий код:

public ProjectInstaller()
            {
                // InitializeComponent();
                serviceProcessInstaller1 = new ServiceProcessInstaller { Account = ServiceAccount.LocalSystem };
                serviceInstaller1 = new ServiceInstaller
                {
                    ServiceName = "WinServiceRelayTest",
                    DisplayName = "WinServiceRelayTest",
                    Description = "WCF Relay Service Hosted by Windows NT Service",
                    StartType = ServiceStartMode.Automatic //set service start automatic
                };
                Installers.Add(serviceProcessInstaller1);
                Installers.Add(serviceInstaller1);
            }

6. Установите сервис

Перейдите к файлу installutil.exe в папке .net, более подробную информацию см. в другой Тема ТАК.

Установить: "C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe" "c:\yourservice.exe"

удалить : "C:\Windows\Microsoft.NET\Framework\v4.0.30319\installutil.exe" /u "c:\yourservice.exe"

введите здесь описание изображения

  1. Проверьте статус службы Windows

введите здесь описание изображения

Если служба не может запуститься должным образом, проверьте средство просмотра событий, чтобы получить подробную информацию об исключении. Затем удалите и установите заново.

введите здесь описание изображения

  1. Проверьте на портале Azure, мы можем получить, что прослушиватель был изменен на 1.

введите здесь описание изображения

person Tom Sun - MSFT    schedule 28.04.2017
comment
Я следую всем твоим шагам. У меня есть один вопрос - вы забыли упомянуть, что нам нужно включить библиотеку служебной шины в проект MyRelayTestService. - person user2995902; 16.05.2017
comment
Как вы упомянули, нам нужно включить в проект библиотеку служебной шины. Я обновлю ответ. - person Tom Sun - MSFT; 17.05.2017
comment
Я обновил свой вопрос с кодом, тот же код работал с консольным приложением (у меня были настройки конфигурации). Не уверен, что в службе Windows есть какие-либо настройки конфигурации, которые мне нужно выполнить. Пожалуйста, дайте мне знать, есть ли что-то, что мне не хватает. Спасибо. - person user2995902; 17.05.2017
comment
Помните о любых правилах сети или брандмауэра, которые есть в вашем центре обработки данных. Мы столкнулись с проблемами, связанными с пространством имен Azure, некоторые заблокировали исходящий трафик https. - person knockando; 30.10.2017

Пожалуйста, проверьте этот код, он работает для меня

protected override void OnStart(string[] args)
 {
    this.EventLog.WriteEntry("Windows Service has been Started!", EventLogEntryType.Information);
    try
    {
      ServiceBusEnvironment.SystemConnectivity.Mode = ConnectivityMode.AutoDetect;
      string serviceNamespace = "Your AzureNamespace";
      string sasKey = "Your SASKey";
      // Create the credentials object for the endpoint.
      TransportClientEndpointBehavior sasCredential = new TransportClientEndpointBehavior();
      sasCredential.TokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider("RootManageSharedAccessKey", sasKey);

      // Create the service URI based on the service namespace.
      Uri address = ServiceBusEnvironment.CreateServiceUri("sb", serviceNamespace, "Your DynamicRelayServiceName");

      // Create the service host reading the configuration.
      host = new ServiceHost(typeof(YourWCFServices), address);
      // Create the ServiceRegistrySettings behavior for the endpoint.
      IEndpointBehavior serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public);

      // Add the Relay credentials to all endpoints specified in configuration.
      foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
      {
          endpoint.Behaviors.Add(serviceRegistrySettings);
          endpoint.Behaviors.Add(sasCredential);
      }

      // Open the azure service.
      host.Open();
      this.EventLog.WriteEntry($"Azure bus service is on at {"Your DynamicRelayServiceName"}!", EventLogEntryType.Information);         

  }         
  catch (Exception ex)          
  {         
      this.EventLog.WriteEntry(ex.Message, EventLogEntryType.Error);        
  }         
}
person Md Tazul Islam    schedule 15.11.2019