Ретрансляторы служебной шины 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 с помощью конечной точки служебной шины обмена сообщениями.

0 ответов

Другие вопросы по тегам