using System.Net.Http.Formatting; using Owin; using System.Web.Http; using System.Web.Http.Cors; using Newtonsoft.Json; using Newtonsoft.Json.Converters; using Newtonsoft.Json.Serialization;
publicclassStartup { // Don't delete! This code configures Web API. // The Startup class is specified as a type parameter in the WebApp.Start method publicvoidConfiguration(IAppBuilder appBuilder) { var config = new HttpConfiguration(); // Configure Web API for self-host config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); config.Formatters.Clear(); config.Formatters.Add(new JsonMediaTypeFormatter()); config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }; config.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new StringEnumConverter()); var cors = new EnableCorsAttribute("*", "*", "*"); config.EnableCors(cors); appBuilder.UseWebApi(config); } }
Выше происходит настройка роутинга, JSON формата запроса/ответа и cors.
Далее в проект требуется добавить WebAPI контроллер. Для примера возьмём контроллер из оригинальной статьи на сайте Microsoft, т.к. используемые мною контроллеры только загромоздят суть повествования излишним содержимым:
using System; using Topshelf; using Microsoft.Owin.Hosting; using System.Configuration;
publicclassProgram { privateconststring ServiceName = "Authentication and WebAPI service";
staticvoidMain() { var port = ConfigurationManager.AppSettings["Port"];
var options = new StartOptions(); options.Urls.Add($"http://*:{port}/");
using (WebApp.Start<Startup>(options)) // Start OWIN host { HostFactory.Run(config => { config.StartAutomatically(); // startup type config.EnableShutdown(); config.Service<AuthApiService>(service => { service.ConstructUsing(svc => new AuthApiService()); service.WhenStarted(svc => svc.Start()); service.WhenStopped(svc => svc.Stop()); }); config.RunAsLocalSystem(); config.SetServiceName(ServiceName); config.SetDisplayName(ServiceName); config.SetDescription(ServiceName); config.EnableServiceRecovery(service => { service.OnCrashOnly(); service.RestartService(delayInMinutes: 0); // first failure service.RestartService(delayInMinutes: 0); // second failure service.RestartService(delayInMinutes: 1); // subsequent failures service.SetResetPeriod(days: 1); // reset period for restart options }); }); } } }
В результате WebAPI начинает прослушивать все входящие запросы на порт, считанный из файла конфигурации и работает Windows-служба, разработанная с помощью фреймворка Topshelf. Вот так вота! Или как говорят французы: Вуаля!