Ретрансляторы служебной шины Azure в .Net Core
TL;DR;
У меня возникают проблемы с получением новых пакетов Nuget Azure Relay.Net Core/ASP.Net Core, работающих с традиционной конечной точкой служебной шины обмена сообщениями.
Полный рассказ
Я пытаюсь преобразовать одно из приложений моей компании с ориентированной на.Net Framework на ориентированную на.Net Core. Наше приложение представляет собой автономную службу OWIN, которая использует ретранслятор Azure для доступа к конечным точкам веб-API за пределами предприятия.
Рабочие конечные точки Azure, с которыми мы говорим, - это шины службы обмена сообщениями.
В версии приложения.Net Framework мы создали WebServiceHost с WCF WebHttpRelayBinding, чтобы начать прослушивание сообщений от ретранслятора Azure. (Я могу предоставить для этого образец кода, если он поможет или понадобится.)
Перенесемся в сегодняшний день. На стороне Azure кажется, что часть ретранслятора была выделена из пространства имен служебной шины в свое собственное пространство имен (пространство имен реле). Из того, что я читал, пространства имен служебной шины обмена сообщениями, в которых не использовались темы и очереди, а также использовались реле, должны были автоматически преобразовываться в пространства имен реле. Похоже, что это не относится ни к одному из производственных пространств имен, с которыми мы общаемся.
В нашем преобразованном приложении.Net Core мы пытаемся использовать пакеты Nuget Microsoft.Azure.Relay и Microsoft.Azure.Relay.AspNetCore.
Наш новый код выглядит примерно так:
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace AzureRelayDemo.Core
{
class Program
{
const string RELAY_CONNECTION_STRING = "Endpoint=sb://my-servicebus-namespace.servicebus.windows.net/;SharedAccessKeyName=AccessKeyName;SharedAccessKey=AccessKeyToken";
/// <summary>
/// This demo attempts to replicate the functionality of AzureRelayDemo.Wcf,
/// but using Asp.Net Core and .Net Core compatible libraries.
///
/// The goal is to start a Web API interface on the localhost,
/// and then start an Azure relay listener to expose the Web API publicly.
/// </summary>
static async Task Main(string[] args)
{
await StartHost(args);
}
private static async Task StartHost(string[] args)
{
IHost host = CreateHostBuilder(args).Build();
await host.RunAsync(new CancellationToken());
}
private static IHostBuilder CreateHostBuilder(string[] args)
{
var hostBuilder =
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostContext, config) =>
{
config.SetBasePath(Directory.GetCurrentDirectory())
.AddEnvironmentVariables()
.AddCommandLine(args);
})
.ConfigureLogging((hostingContext, logging) =>
{
logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));
logging.AddConsole();
logging.AddDebug();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(serverOptions =>
{
serverOptions.ListenAnyIP(8080);
})
.UseStartup<Startup>()
.UseKestrel(t => t.AddServerHeader = false).UseAzureRelay(options =>
{
options.UrlPrefixes.Add(RELAY_CONNECTION_STRING);
});
});
return hostBuilder;
}
}
}
Где находится Startup:
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System.Net.Http;
namespace AzureRelayDemo.Core
{
internal class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services
.AddMvc()
.AddControllersAsServices();
services.AddHttpClient();
services.AddCors(options =>
{
options.AddPolicy("AllowAny", x =>
{
x.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin();
x.WithExposedHeaders("content-disposition");
});
});
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app,
IWebHostEnvironment env,
IHttpClientFactory httpClientFactory,
ILoggerFactory loggerFactory
)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
CorsMiddlewareExtensions.UseCors(app, "AllowAny");
app.UseEndpoints(endpoints => { endpoints.MapDefaultControllerRoute(); });
}
}
}
Выполнение этого генерирует исключение, указывающее, что конечная точка не может быть найдена:
Microsoft.Azure.Relay.EndpointNotFoundException: "Конечная точка не существует.
Я подозреваю, что это связано с тем, что конечная точка, к которой я пытаюсь подключиться, является конечной точкой служебной шины обмена сообщениями, а новые библиотеки, вероятно, работают только с пространствами имен реле (где вы можете создать новое гибридное реле, а имя реле является частью соединения. строка).
В настоящее время параметром этого проекта является сохранение части Azure нашей производственной системы как есть (то есть без преобразования / замены существующих служебных шин пространствами имен реле).
Есть ли другой путь, на который мне нужно начать смотреть, чтобы иметь возможность прослушивать ретранслятор на конечной точке служебной шины в.Net Core/ASP.Net Core?
Есть ли что-то незначительное, чего мне просто не хватает в том, что я сейчас пытаюсь сделать?
Заранее спасибо.
Обновить
А пока у нас есть обходной путь. Мы создали своего рода прокси, написанные для.Net Framework и использующие пакет Nuget WindowsAzure.ServiceBus.
Прокси-сервер становится слушателем ретрансляции. После получения сообщения через ретранслятор он перенаправляет запрос в основное приложение, а затем отвечает ретранслятору соответствующим ответом.
Это позволяет нашему основному приложению ориентироваться на.Net Core без внесения изменений в рабочие конечные точки Azure.
Мне все равно было бы любопытно, есть ли возможность исключить прокси-компонент этого и все же иметь возможность установить прослушиватель ретрансляции в.Net Core с помощью конечной точки служебной шины обмена сообщениями.