我在控制台应用程序中运行了一个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();
}
}
}
答案 0 :(得分:2)
是否可以使用Windows服务应用程序创建azure服务总线中继?
是的,我们可以使用Windows服务执行此操作。我做了一个演示。以下是我的详细步骤。
1.使用Azure门户创建一个Relay命名空间,我们可以从official document获取更多信息。并在Azure门户上创建WCF中继。
2.第一个模块:WCF服务库(WCFRelay.dll)
服务合同的定义
[ServiceContract]
public interface IRelayTest
{
[OperationContract]
string DoWork();
}
服务合同的实施
public class RelayTest : IRelayTest
{
public string DoWork()
{
return "hello";
}
}
为服务实施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.将安装程序添加到服务
添加以下代码:
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"
答案 1 :(得分:0)
请检查此代码,它对我有用
def associateEnergyReducedUdf(consumptionType: String)(consumedEnergyCol: Column) =
() => associateEnergyUdf(consumptionType)(col("MOTOR_TYPE"), consumedEnergyCol, col("ELECTRIFICATION_RATIO"))