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

时间:2017-04-27 19:34:14

标签: azure console-application azureservicebus azure-servicebusrelay

我在控制台应用程序中运行了一个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();
        }
    }
}

错误:error message

2 个答案:

答案 0 :(得分:2)

  

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

是的,我们可以使用Windows服务执行此操作。我做了一个演示。以下是我的详细步骤。

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

enter image description here

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

服务合同的定义

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

服务合同的实施

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

enter image description here

  1. 第二个模块:创建WCF中继Windows服务并引用创建的WCFRelay.dll
  2. enter image description here

    1. 为服务实施OnStart和OnStop

      公共部分类MyRelayTestService:ServiceBase     {         ServiceHost m_svcHost = new 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.将安装程序添加到服务

      enter image description here

    2. 添加以下代码:

      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 thread

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

      enter image description here

      1. 检查Windows服务状态
      2. enter image description here

        如果服务无法按预期启动,请检查事件查看器以获取详细信息异常信息。然后卸载并重新安装。

        enter image description here

        1. 从Azure门户检查,我们可以将监听器更改为1。
        2. enter image description here

答案 1 :(得分:0)

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

def associateEnergyReducedUdf(consumptionType: String)(consumedEnergyCol: Column) =
      () => associateEnergyUdf(consumptionType)(col("MOTOR_TYPE"), consumedEnergyCol, col("ELECTRIFICATION_RATIO"))