Nancy 503 Ошибки переключения на собственный хост OWIN - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть несколько веб-сервисов, в настоящее время размещенных с Nancy.Hosting.Self

Мне нужно переместить службы из Nancy.Hosting.Self в хостинг с Microsoft.Owin.SelfHost, чтобы я мог использовать OWIN для аутентификации пользователей.

Теоретически, я должен иметь возможность просто заменить мой класс NancySelfHost классом запуска Owin. Однако при запуске службы с моим классом запуска Owin Нэнси возвращает: «Ошибка HTTP 503. Служба недоступна».

В настоящее время я меняю класс хостинга на основе параметров сборки. (Они запускаются через TopShelf )

Пусковая:

 #define OWIN
 using Topshelf;

 namespace BasisRESTApi
 {
     public class Program
     {
         private static readonly string _serviceName = "MyRestApi";
         private static readonly string _displayName = "My REST services";
         private static readonly string _description = "Minor RESTful web services for interop.";
         public static void Main()
         {
             HostFactory.Run(x =>
             {
                 x.UseLinuxIfAvailable();
                 // Automate recovery
                 x.EnableServiceRecovery(recover =>
                 {
                     recover.RestartService(0);
                 });
 #if OWIN
                 x.Service<Startup>(s =>
                 {
                     s.ConstructUsing(name => new Startup(_serviceName));
 #else
                 x.Service<NancySelfHost>(s =>
                 {
                     s.ConstructUsing(name => new NancySelfHost());
 #endif
                 s.WhenStarted(tc => tc.Start());
                     s.WhenStopped(tc => tc.Stop());
                 });
                 x.StartAutomatically();
                 x.RunAsLocalSystem();
                 x.SetDescription(_description);
                 x.SetDisplayName(_displayName);
                 x.SetServiceName(_serviceName);
             });
         }
     }
 }

NancySelfHost: (Работает)

using System;
using System.Configuration;
using System.Net;
using System.Text.RegularExpressions;
using System.Threading;
using Logging;
using Nancy.Hosting.Self;
using static Logging.Logging;

namespace BasisRESTApi
{
    public class NancySelfHost
    {
        private NancyHost _nancyHost;

        public void Start()
        {
            var hostUrl = "https://localhost:2020";
            _nancyHost = new NancyHost(new Uri(hostUrl));
            _nancyHost.Start();
        }

        public void Stop()
        {
            _nancyHost.Stop();
        }
    }
}

Owin Startup: (запускается, но возвращает 503 ошибки)

using Logging;
using Microsoft.Owin;
using Microsoft.Owin.Hosting;
using Owin;
using System;
using System.Configuration;
using System.Net;
using System.Text.RegularExpressions;
using System.Web.Http;
using static Logging.Logging;

[assembly: OwinStartup(typeof(BasisRESTApi.Startup))]
namespace BasisRESTApi
{
    public class Startup
    {
        public string ServiceName { get; set; }
        private static IDisposable _application;

        public Startup(string serviceName)
        {
            ServiceName = serviceName;
        }

        public void Start()
        {
            var hostUrl = "https://localhost:2020";
            _application = WebApp.Start<Startup>(hostUrl);
        }

        public void Stop()
        {
            _application?.Dispose();
        }

        public void Configuration(IAppBuilder application)
        {
            UseWebApi(application);
            application.UseErrorPage();
            var listener = (HttpListener)application.Properties["System.Net.HttpListener"];
            // Different authentication methods can be specified for the webserver here
            listener.AuthenticationSchemes = AuthenticationSchemes.Negotiate;

            //NOTE:All of the above can be removed and the issue is not impacted.
            application.UseNancy();
        }

        /// <summary>
        /// Provide API Action
        /// </summary>
        /// <param name="application"></param>
        private static void UseWebApi(IAppBuilder application)
        {
            var config = new HttpConfiguration();
            config.MapHttpAttributeRoutes();
            application.UseWebApi(config);
        }
    }
}

Другие примечания:

  • UrlAcls и SslCerts правильно настроены для работы с этим портом, о чем свидетельствует его работа с NancySelfHost.
  • У меня нет повторяющихся записей urlacl согласно 503 Ошибка при использовании NancyFx с Owin
  • Я пробовал порты выше: 5000, и это не помогло
  • Те же проблемы возникают при запуске через Visual Studio от имени администратора или от консоли с правами администратора. (Досадно, что OWIN требует прав администратора для самостоятельного размещения)
  • 503 генерируется до запуска любого кода обработчика. (IOW, точки останова при вводе кода веб-сервиса не достигаются.)

1 Ответ

0 голосов
/ 18 сентября 2018

Я нашел ответ здесь

По сути, urlacl, необходимый для самостоятельного хостинга Nancy, не нужен для самостоятельного хостинга OWIN, и фактически вызывает ошибки 503, если он не удален. (Очевидно, что OWIN использует какой-то другой механизм для получения прав на порт - вероятно, причина, по которой OWIN требует прав администратора для запуска .exe или для отладки .exe в Visual Studio)

Запуск следующей решил проблему:

netsh http delete urlacl  url=https://+:2020/
...