首页 > 其他分享 >DotNet8自宿主web服务器搭建记录

DotNet8自宿主web服务器搭建记录

时间:2024-06-06 18:33:43浏览次数:21  
标签:WebSite web ConfigTool DotNet8 WinService using 服务器 Microsoft public

建立3个项目,分别是类库项目ConfigTool.WebSite、webapi项目ConfigTool.TestWebSite、webapi项目ConfigTool.WinService,目标框架均为.NET8。

  其中控制台ConfigTool.TestWebSite方便开发调试,win服务ConfigTool.WinService作为宿主服务,类库ConfigTool.WebSite为自定义web服务器的主体代码。

一、项目框架

ConfigTool.WebSite引用nuget包:

Microsoft.Extensions.Hosting 8.0.0
Microsoft.Extensions.Hosting.Abstractions 8.0.0
Microsoft.NETCore.DotNetHost 8.0.6
Swashbuckle.AspNetCore 6.6.2

ConfigTool.WebSite的项目文件内容如下:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.0" />
    <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.0" />
    <PackageReference Include="Microsoft.NETCore.DotNetHost" Version="8.0.6" />
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" />
  </ItemGroup>
	
  <ItemGroup>
    <None Remove="wwwroot\index.html" />
  </ItemGroup>

  <ItemGroup>
    <Content Include="wwwroot\index.html">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

  <ItemGroup>
    <None Update="wwwroot\images\1.jpg">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>

</Project>

ConfigTool.TestWebSite的项目文件内容如下:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net8.0</TargetFramework>
    <ImplicitUsings>enable</ImplicitUsings>
    <Nullable>enable</Nullable>
    <SupportedOSPlatformVersion>10.0.17763.0</SupportedOSPlatformVersion>
  </PropertyGroup>
  
  <ItemGroup>
    <ProjectReference Include="..\ConfigTool.WebSite\ConfigTool.WebSite.csproj" />
  </ItemGroup>

</Project>

ConfigTool.WinService引用nuget包:

Microsoft.Extensions.Hosting.WindowsServices 8.0.0

ConfigTool.WinService的项目文件内容如下:

<Project Sdk="Microsoft.NET.Sdk.Web">

	<PropertyGroup>
		<TargetFramework>net8.0-windows</TargetFramework>
		<Nullable>enable</Nullable>
		<ImplicitUsings>enable</ImplicitUsings>
		<RootNamespace>App.WindowsService</RootNamespace>
		<OutputType>exe</OutputType>
		<PublishSingleFile Condition="'$(Configuration)' == 'Release'">true</PublishSingleFile>
		<RuntimeIdentifier>win-x64</RuntimeIdentifier>
		<PlatformTarget>x64</PlatformTarget>
		<UserSecretsId>dotnet-smart_sign-ef6ac77d-c996-482b-8f81-5d63d0c287a5</UserSecretsId>
	</PropertyGroup>

	<ItemGroup>
	  <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
	</ItemGroup>

	<ItemGroup>
	  <ProjectReference Include="..\ConfigTool.WebSite\ConfigTool.WebSite.csproj" />
	</ItemGroup>

	<ItemGroup>
	  <None Update="install.bat">
	    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
	  </None>
	  <None Update="uninstall.bat">
	    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
	  </None>
	</ItemGroup>

</Project>

二、代码编写

2.1、ConfigTool.WebSite

在ConfigTool.WebSite中增加目录Controllers和wwwroot

using Microsoft.AspNetCore.Mvc;

namespace ConfigTool.WebSite.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class ValuesController : ControllerBase
    {
        [HttpGet]
        [Route("Time")]
        public string Time()
        {
            return DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss");
        }

    }
}

在wwwroot下放入index.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title></title>
    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js">
</script>
</head>
<body>
    <p>
        <input type="text" id="curtime" value="1"/>
        <button id="submit">从api接口获取当前服务器时间</button>
    </p>
    <p>
        <image src="images/1.jpg" alt="验证静态资源" width="300" height="300"/>
    </p>
</body>

<script>
    $("#submit").click(function(){
        $.get("api/Values/Time",function(data,status){    
            $("#curtime").val(data);
        });
    });
</script>
</html>

新增WebServer类文件

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.Hosting;

namespace ConfigTool.WebSite
{
    public class WebServer
    {
        readonly WebApplication app;
        int? port = 8080;
        string? url;
        public WebServer()
        {
            var webBuilder = WebApplication.CreateBuilder();
            webBuilder.Services.AddControllers();
            app = webBuilder.Build();
            app.MapControllers();
        }

        public void Init(int port)
        {
            this.port = port;
            app.UseStaticFiles(new StaticFileOptions
            {
                FileProvider = new PhysicalFileProvider(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "wwwroot")),
                RequestPath = ""
            });
            var host = "*";
            url = $"http://{host}:{port}";
            app.Urls.Add(url);
        }

        /// <summary>
        /// 启动web服务,并阻塞调用进程直到程序退出,这里提供给控制台程序调用
        /// </summary>
        public void Run()
        {
            app.Run();
        }

        /// <summary>
        /// 启动web服务,这里提供给服务程序调用
        /// </summary>
        public void Start()
        {
            app.Start();
        }

        /// <summary>
        /// 停止web服务,这里提供给服务程序调用
        /// </summary>
        public void Stop()
        {
            app.StopAsync();
        }


    }
}

2.2、ConfigTool.TestWebSite

ConfigTool.TestWebSite的Program.cs代码如下:

using ConfigTool.WebSite;

namespace ConfigTool.TestWebSite
{
    internal class Program
    {
        static void Main(string[] args)
        {
            WebServer server = new();
            server.Init(8080);
            server.Run();

            Console.ReadLine();
        }
    }
}

可以用来调试业务代码。

2.3、ConfigTool.WinService

ConfigTool.WinService的的Program.cs代码如下:

using App.WindowsService;
using ConfigTool.WebSite;

namespace ConfigTool.WinService
{
    public class Program
    {
        public static void Main(string[] args)
        {
            HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
            builder.Services.AddWindowsService(options =>
            {
                options.ServiceName = "ConfigTool.WinService";
            });

            builder.Services.AddSingleton<WebServer>();
            builder.Services.AddHostedService<WindowsBackgroundService>();

            IHost host = builder.Build();
            host.Run();
        }
    }
}

WindowsBackgroundService.cs代码如下:

using ConfigTool.WebSite;

namespace App.WindowsService;

public sealed class WindowsBackgroundService : BackgroundService
{
    private readonly WebServer webServer;
    private readonly ILogger<WindowsBackgroundService> logger;

    private bool isRunning = false;
    private static readonly object locker = new();

    public WindowsBackgroundService(WebServer webServer, ILogger<WindowsBackgroundService> logger)
    {
        this.webServer = webServer;
        this.logger = logger;
        this.webServer.Init(5000);
    }

    protected override Task ExecuteAsync(CancellationToken stoppingToken)
    {
        return Task.CompletedTask;
    }

    public override Task StartAsync(CancellationToken cancellationToken)
    {
        if (isRunning)
        {
            return Task.CompletedTask;
        }
        if (!isRunning)
        {
            lock (locker)
            {
                if (isRunning)
                {
                    return Task.CompletedTask;
                }
                isRunning = true;
            }
        }
        this.webServer.Start();

        return base.StartAsync(cancellationToken);
    }

    public override Task StopAsync(CancellationToken cancellationToken)
    {
        if (!isRunning)
        {
            return Task.CompletedTask;
        }
        if (isRunning)
        {
            lock (locker)
            {
                if (!isRunning)
                {
                    return Task.CompletedTask;
                }
                isRunning = false;
            }
        }
        this.webServer.Stop();
        return base.StopAsync(cancellationToken);
    }

}

install.bat的内容如下:

echo "service installing......" 
echo off  
@sc create ConfigTool.WinService binpath="%~dp0ConfigTool.WinService.exe"
@sc config ConfigTool.WinService start=auto
@net start ConfigTool.WinService
echo on 
echo "service started"
timeout /t 5

其中%~dp0表示bat脚本的当前目录的意思。

uninstall.bat的内容如下:

echo "uninstall service......" 
echo off  
@net stop ConfigTool.WinService
@sc delete ConfigTool.WinService
echo on
echo "service uninstalled"
timeout /t 5

 

标签:WebSite,web,ConfigTool,DotNet8,WinService,using,服务器,Microsoft,public
From: https://www.cnblogs.com/lucienbao/p/18235754/net8selfhostedwebserver

相关文章

  • Web应用课 第三讲 文本、字体、背景、边框、展示格式
    文本对齐方式text-alignCSS属性定义行内内容(例如文字)如何相对它的块父元素对齐。text-align并不控制块元素自己的对齐,只控制它的行内内容的对齐。left 把文本排列到左边。默认值:由浏览器决定。right 把文本排列到右边。center 把文本排列到中间。justify 实现两端对齐文......
  • 入手戴尔R720服务器(1)通过iDRAC查看系统信息
    想入手服务器很久了,一直担心功耗太高,今天狠心搞了一台戴尔服务器R720。需求开虚拟机,核心数要多学习以下Windows云桌面AD域控officeonlineserverubuntu试验机随便折腾不怕玩坏最好两个网口以上稳定四个以上硬盘位‍为什么是R720?1000元预算......
  • 入手戴尔R720服务器(1)通过iDRAC查看系统信息
    想入手服务器很久了,一直担心功耗太高,今天狠心搞了一台戴尔服务器R720。需求开虚拟机,核心数要多学习以下Windows云桌面AD域控officeonlineserverubuntu试验机随便折腾不怕玩坏最好两个网口以上稳定四个以上硬盘位‍为什么是R720?1000元预算......
  • Web攻防:SQL注入 - 前置知识
    SQL注入-前置知识1.注入原理1.1.什么是SQL注入1.2.SQL注入产生的条件2.系统函数2.1.version()-MySQL版本2.2.user()-数据库用户名2.3.database()-数据库名2.4.@@datadir-数据库路径2.5.@@version_compile_os-操作系统版本3.字符串连接函数3.1.C......
  • 入手戴尔R720服务器(1)通过iDRAC查看系统信息
    想入手服务器很久了,一直担心功耗太高,今天狠心搞了一台戴尔服务器R720。需求开虚拟机,核心数要多学习以下Windows云桌面AD域控officeonlineserverubuntu试验机随便折腾不怕玩坏最好两个网口以上稳定四个以上硬盘位‍为什么是R720?1000元预算......
  • 戴尔R720服务器(4)虚拟机性能测试
    物理机环境机型戴尔R720系统环境PVECPUE5-2660V22.2GHz双路内存1333MHz单通道内存1333MHz双通道硬盘用6块转速1万的2.5寸盘组的RAID5,使用了H310mini阵列卡‍测试工具:Sysbench。一个跨平台的基准测试工具,用于评估系统性能,包括CP......
  • 戴尔R720服务器(4)虚拟机性能测试
    物理机环境机型戴尔R720系统环境PVECPUE5-2660V22.2GHz双路内存1333MHz单通道内存1333MHz双通道硬盘用6块转速1万的2.5寸盘组的RAID5,使用了H310mini阵列卡‍测试工具:Sysbench。一个跨平台的基准测试工具,用于评估系统性能,包括CP......
  • 部署项目到云服务器遇到的问题
    问题1:HTTPStatus500–InternalServerError(SpringBoot架构的Web项目部署到linux系统上访问出错):数据库的配置错误,服务器上是5.版本的MySQL,需要将配置改为5.的配置,数据库名称密码要一模一样问题2:记录报错_linux:suroot报错:su:Authenticationfailure![](https://img2024.......
  • 关于最后部署项目到服务器
    问题1:HTTPStatus500–InternalServerError(SpringBoot架构的Web项目部署到linux系统上访问出错):数据库的配置错误,服务器上是5.版本的MySQL,需要将配置改为5.的配置,数据库名称密码要一模一样问题2:记录报错_linux:suroot报错:su:Authenticationfailure输入sudopasswd......
  • open-webui无法链接ollama 报错ERROR:apps.ollama.main:Connection error: Cannot con
    一个问题找了很久,网上没有现成的答案,我来写一个,方便再遇到的人一、问题1.ollama是使用官方curl-fsSLhttps://ollama.com/install.sh|sh 安装的2. open-webui是docker启动,docker正常启动,使用github推荐的#WebUI与ollama在同一台机器:sudodockerrun-d-p3000:8080......