1

我有一个在控制台应用程序中运行的 Windows 服务总线中继应用程序。最初我使用控制台应用程序创建用于测试。现在我需要将此控制台应用程序转换为 Windows 服务。所有 Azure 文档仅显示带有控制台应用程序的示例。

有没有一种方法可以使用 Windows 服务创建服务总线中继应用程序,这样在我的客户端我就不需要运行这个控制台应用程序(作为命令提示符)。

我正在尝试将云应用程序连接到公司/安全网络。


创建了一个新的 MVC Web 应用程序来与中继服务通信。不知道我错过了什么。我需要在“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();
        }
    }
}

错误:

4

2 回答 2

3

是否可以使用 Windows 服务应用程序创建 Azure 服务总线中继?

是的,我们可以使用 Windows 服务做到这一点。我为它做了一个演示。以下是我的详细步骤。

1.使用 Azure 门户创建一个 Relay 命名空间,我们可以从官方文档中获取更多信息。并在 Azure 门户上创建 WCF 中继。

在此处输入图像描述

2.第一个模块:WCF服务库(WCFRelay.dll)

服务合同的定义

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

服务合同的执行

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

在此处输入图像描述

  1. 第二个模块:创建WCF Relay Windows Service并引用创建的WCFRelay.dll

在此处输入图像描述

  1. 为服务实现 OnStart 和 OnStop

    公共部分类 MyRelayTestService : ServiceBase { ServiceHost m_svcHost = new ServiceHost(typeof(RelayTest)); 公共 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.安装服务

导航到您的 .net 文件夹中的 installutil.exe,更多详细信息请参阅另一个SO 线程

安装 :"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。

在此处输入图像描述

于 2017-04-28T06:42:20.597 回答
0

请检查此代码,它对我有用

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);        
  }         
}
于 2019-11-15T18:02:10.547 回答