Мой главный вопрос: в чем разница между службой самообслуживания внутри консольного приложения и службой windows?
Я написал консольное приложение Self-Host Web API, которое предоставляет простой API. Для этого я использовал в основном пример MSDN:
public class Startup
{
public void Configuration(IAppBuilder appBuilder)
{
var config = new HttpConfiguration();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}",
defaults: new { id = RouteParameter.Optional }
);
appBuilder.UseWebApi(config);
}
}
public class HeartbeatController : ApiController
{
public HttpResponseMessage Get()
{
var jsonToSend = GetJsonHeartbeatStatus();
if (!string.IsNullOrEmpty(jsonToSend))
{
var response = this.Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(jsonToSend, Encoding.UTF8, "application/json");
return response;
}
throw new HttpResponseException(HttpStatusCode.NotFound);
}
private string GetJsonHeartbeatStatus()
{
var hs = new HeartbeatStatus();
hs.Toolname = "html Scraper";
hs.Heartbeat = DateTime.Now.ToString();
hs.Plant = "plant1";
hs.Department = "departmentA";
hs.Servername = Environment.MachineName;
return JsonConvert.SerializeObject(hs);
}
}
protected override void OnStart(string[] args)
{
base.OnStart(args);
logger.Info("In OnStart");
var UserDomain = System.Net.NetworkInformation.IPGlobalProperties.GetIPGlobalProperties().DomainName;
var Port = "8377";
string baseAddress = string.Format("http://{0}.{1}:{2}", Environment.MachineName, UserDomain, Port);
var completeAddress = baseAddress + "/api/heartbeat";
try
{
host = WebApp.Start<Startup>(baseAddress);
HttpClient client = new HttpClient();
var response = client.GetAsync(completeAddress).Result;
logger.Info("Api address: {0}", completeAddress);
logger.Info("Service Host started @{0}", DateTime.Now.ToString());
}
catch (Exception ex)
{
logger.Info("{0}", ex.ToString());
}
finally
{
if (host != null)
{
host.Dispose();
}
}
}
Следующим шагом было написание входящей роли брандмауэра для получения доступа к порту.
Затем я протестировал ее на нашем Windows сервере. Стандарт 2016 года.
-> Тест пройден в Postman на другом компьютере!
Теперь, как вы уже видели (в коде), я перенес код в Windows Приложение службы (user = Local) System). Я вхожу в Windows Событие, и у меня нет ошибки при запуске хоста (поэтому я использовал try catch).
-> Не удалось выполнить тест с браузером на сервере, а также с Postman на другом machine.
Я понял, что должен зарезервировать путь с помощью netsh
Я попытался:
netsh http add urlacl url=http://+:8377/api/heartbeat user=everyone
netsh http add urlacl url=http://machineName.corp:8377/api/heartbeat/ user=everyone
Установил приложение Сервис с моим пользователем (admin) и настроил URL
netsh http add urlacl url=http://+:8377/api/heartbeat user=myUser
netsh http add urlacl url=http://machineName.corp:8377/api/heartbeat/ user=myUser
-> Проверка с помощью браузера на сервере не удалось, а также с почтальоном на другом компьютере.
На данный момент я не мог найти решение, почему мой API не работает.
У кого-нибудь есть идеи?
-edit-
Консольное приложение:
C: \ Windows \ system32> netstat -na | найти "8378" TCP 0.0.0.0:8378 0.0.0.0:0 СЛУШАТЬ TCP [::]: 8378 [::]: 0 СЛУШАТЬ TCP [fe80 :: 5505: 852 c: 952e: 74f% 6]: 8378 [fe80 :: 5505: 852 c: 952e: 74f% 6]: 62555 УСТАНОВЛЕННЫЙ TCP [fe80 :: 5505: 852 c: 952e: 74f% 6]: 62555 [fe80 :: 5505: 852 c : 952e: 74f% 6]: 8378 УСТАНОВЛЕНО
Windows Приложение службы:
C: \ Windows \ system32> netstat -na | найти "8377" нет ответа!