Служба Windows с веб-интерфейсом.NET C#
Мне нужно разработать службу Windows, которая будет выполнять некоторые основные задачи несколько раз в день, ничего особенного. Как часть требований, ему необходим веб-интерфейс, чтобы его можно было настроить из браузера.
Пример:
Мистер Инженер открывает свой браузер и вводит
localhost:1234/Config
, Возвращается простая html веб-страница, которая позволяет ему вводить некоторые значения и публиковать их на сервере. Служба Windows будет использовать эти новые значения.
В настоящее время у меня есть два разных способа сделать это. Во-первых, просто создав WebServiceHost в моей ServiceBase следующим образом:
// Provide the base address.
serviceHost = new WebServiceHost(typeof(Service), new Uri(baseAddress));
// Open the ServiceHostBase
serviceHost.Open();
Затем я создаю IService и указываю операцию следующим образом:
[OperationContract]
[WebGet]
Stream Get();
И, наконец, реализовать интерфейс так:
public Stream Get()
{
UriTemplateMatch uriInfo = WebOperationContext.Current.IncomingRequest.UriTemplateMatch;
WebOperationContext.Current.OutgoingResponse.ContentType = "text/html";
MemoryStream rawResponse = new MemoryStream();
TextWriter response = new StreamWriter(rawResponse, Encoding.UTF8);
response.Write("<h1>test</h1>");
response.Flush();
rawResponse.Position = 0;
return rawResponse;
}
Это работает FINE. Я могу запросить веб-сервис из моего браузера и получаю желаемый результат.
Однако недавно я наткнулся на WebApi и смог повторить такой же успех, выполнив следующие действия:
HttpSelfHostConfiguration config = new HttpSelfHostConfiguration(new Uri("http://localhost:50231/"));
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}",
defaults: new { id = RouteParameter.Optional });
// Create server
var server = new HttpSelfHostServer(config);
// Start listening
server.OpenAsync().Wait();
И затем, имея контроллер, например, так:
public class HelloController : ApiController
{
public HttpResponseMessage Get()
{
var response = new HttpResponseMessage();
response.Content = new StringContent("<html><body>Hello World</body></html>");
response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
return response;
}
}
Итак, вот два метода, которые я придумала для удовлетворения требований. Какой из них считается лучше? Или они оба ужасные и есть лучший способ?