Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法访问windows Server 2016 RSAPI上的自托管windows服务(控制台应用程序运行正常)_C#_Asp.net Web Api_Windows Services_Owin_Windows Server 2016 - Fatal编程技术网

C# 无法访问windows Server 2016 RSAPI上的自托管windows服务(控制台应用程序运行正常)

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

我的主要问题是: 控制台应用程序内的自托管服务与windows服务之间有什么区别

我编写了一个自宿主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();
                }
            }
        }
公共类启动
{
公共无效配置(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” 没有回应