У меня есть несколько веб-сервисов, в настоящее время размещенных с 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, точки останова при вводе кода веб-сервиса не достигаются.)