C# 无法访问windows Server 2016 RSAPI上的自托管windows服务(控制台应用程序运行正常)
我的主要问题是: 控制台应用程序内的自托管服务与windows服务之间有什么区别 我编写了一个自宿主Web API控制台应用程序,它提供了一个简单的API。为此,我基本上使用了MSDN示例:C# 无法访问windows Server 2016 RSAPI上的自托管windows服务(控制台应用程序运行正常),c#,asp.net-web-api,windows-services,owin,windows-server-2016,C#,Asp.net Web Api,Windows Services,Owin,Windows Server 2016,我的主要问题是: 控制台应用程序内的自托管服务与windows服务之间有什么区别 我编写了一个自宿主Web API控制台应用程序,它提供了一个简单的API。为此,我基本上使用了MSDN示例: public class Startup { public void Configuration(IAppBuilder appBuilder) { var config = new HttpConfiguration(); config.Routes.Ma
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();
}
}
}
公共类启动
{
公共无效配置(IAppBuilder appBuilder)
{
var config=新的HttpConfiguration();
config.Routes.MapHttpRoute(
名称:“DefaultApi”,
routeTemplate:“api/{controller}”,
默认值:新建{id=RouteParameter.Optional}
);
appBuilder.UseWebApi(配置);
}
}
公共类HeartbeatController:ApicController
{
公共HttpResponseMessage Get()
{
var jsonToSend=GetJsonHeartbeatStatus();
如果(!string.IsNullOrEmpty(jsonToSend))
{
var response=this.Request.CreateResponse(HttpStatusCode.OK);
response.Content=newstringcontent(jsonToSend,Encoding.UTF8,“application/json”);
返回响应;
}
抛出新的HttpResponseException(HttpStatusCode.NotFound);
}
私有字符串GetJsonHeartbeatStatus()
{
var hs=新的HeartbeatStatus();
hs.Toolname=“html刮刀”;
hs.Heartbeat=DateTime.Now.ToString();
hs.Plant=“plant1”;
hs.Department=“部门A”;
hs.Servername=Environment.MachineName;
返回JsonConvert.SerializeObject(hs);
}
}
启动时受保护的覆盖无效(字符串[]args)
{
base.OnStart(args);
logger.Info(“在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”;
尝试
{
主机=WebApp.Start(基本地址);
HttpClient=新的HttpClient();
var response=client.GetAsync(completedAddress).Result;
Info(“Api地址:{0}”,completeAddress);
Info(“服务主机已启动@{0}”,DateTime.Now.ToString());
}
捕获(例外情况除外)
{
logger.Info(“{0}”,例如ToString());
}
最后
{
if(主机!=null)
{
host.Dispose();
}
}
}
下一步是编写防火墙入站角色以访问端口
然后我在我们的Windows Server 2016标准上测试了它
->邮递员在另一台机器上通过了测试
现在,正如您已经看到的(在代码中),我将代码带到一个Windows服务应用程序(用户=本地系统)。我正在登录Windows事件,启动主机时没有错误(这就是我使用try-catch的原因)
->使用服务器上的浏览器以及其他计算机上的邮递员进行测试失败
我发现我必须用netsh
我试过:
netsh http add urlacl url=http://+:8377/api/heartbeat user=everyone
netsh http添加urlacl url=http://machineName.corp:8377/api/heartbeat/ 用户=所有人
使用我的用户(管理员)安装服务应用程序并设置URL
netsh http add urlacl url=http://+:8377/api/heartbeat user=myUser
netsh http添加urlacl url=http://machineName.corp:8377/api/heartbeat/ user=myUser
->使用服务器上的浏览器以及其他计算机上的邮递员进行测试失败
在这一点上,我找不到任何解决方案,为什么我的api不工作
有人有什么想法吗
-编辑-
控制台应用程序:
C:\Windows\system32>netstat-na |查找“8378”
TCP 0.0.0.0:8378 0.0.0.0:0侦听
TCP[::]:8378[:]:0正在侦听
TCP[fe80::5505:852c:952e:74f%6]:8378[fe80::5505:852c:952e:74f%6]:62555已建立
TCP[fe80::5505:852c:952e:74f%6]:62555[fe80::5505:852c:952e:74f%6]:8378已建立
Windows服务应用程序:
C:\Windows\system32>netstat-na |查找“8377”
没有回应