c# - 最小占用空间/准系统 ASP.NET Core WebAPI

标签 c# asp.net-core asp.net-core-webapi

只是为了好玩,今天早些时候我的一位同事问我是否可以尝试制作一个占用空间很小的 WebAPI,它使用 ASP.NET Core 回应请求。 我用大约 70 行代码就完成了 WebAPI。多亏了 ASP.NET Core 的出色表现! 所以,这就是我到目前为止的结果。

代码

using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using System;
using System.Linq;

namespace TinyWebApi
{
    class Program
    {
        static readonly IWebHost _host;
        static readonly string[] _urls = { "http://localhost:80" };

        static Program()
        {
            IConfiguration _configuration = new ConfigurationBuilder()
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
                .Build();
            _host = BuildHost(new WebHostBuilder(), _configuration, _urls);
        }

        static void Main(string[] args)
        {
            _host.Run();
        }

        static IWebHost BuildHost(
            IWebHostBuilder builder, IConfiguration configuration, params string[] urls)
        {
            return builder
                .UseKestrel(options =>
                {
                    options.NoDelay = true;
                })
                .UseConfiguration(configuration)
                .UseUrls(urls)
                .Configure(app =>
                {
                    app.Map("/echo", EchoHandler);
                })
                .Build();
        }

        static void EchoHandler(IApplicationBuilder app)
        {
            app.Run(async context =>
            {
                await context.Response.WriteAsync(
                    JsonConvert.SerializeObject(new
                    {
                        StatusCode = (string)context.Response.StatusCode.ToString(),
                        PathBase = (string)context.Request.PathBase.Value.Trim('/'),
                        Path = (string)context.Request.Path.Value.Trim('/'),
                        Method = (string)context.Request.Method,
                        Scheme = (string)context.Request.Scheme,
                        ContentType = (string)context.Request.ContentType,
                        ContentLength = (long?)context.Request.ContentLength,
                        QueryString = (string)context.Request.QueryString.ToString(),
                        Query = context.Request.Query
                            .ToDictionary(
                                _ => _.Key,
                                _ => _.Value,
                                StringComparer.OrdinalIgnoreCase)
                    })
                );
            });
        }
    }
}

(上面的代码按预期工作,没有损坏。)


WebAPI

WebAPI 应该使用 JSON 回显请求。

示例请求

http://localhost/echo?q=foo&q=bar

示例响应

{
  "StatusCode": "200",
  "PathBase": "echo",
  "Path": "",
  "Method": "GET",
  "Scheme": "http",
  "ContentType": null,
  "ContentLength": null,
  "QueryString": "?q=foo&q=bar",
  "Query": {
    "q": [
      "foo",
      "bar"
    ]
  }
}

我的问题

我仅用 70 多行代码就让我的同事大吃一惊,但是当我们查看文件大小时,它并没有那么令人印象深刻...

At the moment with all these dependencies, my WebAPI is compiling to 54.3MB.

我一直在尝试找出如何减少该项目的磁盘占用空间。我安装的软件包捆绑了很多我们并不真正需要的东西,我一直遇到麻烦,试图找到最好的资源或方法来删除这个项目不需要的引用。

.csproj

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.1</TargetFramework>
    <RuntimeIdentifier>win7-x64</RuntimeIdentifier>
    <ApplicationIcon>Icon.ico</ApplicationIcon>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore" Version="1.1.2" />
    <PackageReference Include="Microsoft.AspNetCore.Hosting.Abstractions" Version="1.1.2" />
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="1.1.3" />
    <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="1.1.2" />
    <PackageReference Include="Microsoft.Extensions.Configuration.FileExtensions" Version="1.1.2" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="1.1.2" />
    <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="1.1.2" />
    <PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
  </ItemGroup>

</Project>

有没有什么快速的方法可以让我根据提供的代码知道我的项目需要哪些引用?我早些时候开始清除所有上述依赖项,然后尝试一一添加,但事实证明,试图解决丢失的引用是一个永无休止的头痛问题,而且似乎需要永远解决。我敢肯定有人有这样的解决方案,但我似乎无法找到它。谢谢。

最佳答案

我所做的只是将代码复制到一个新的 .NET Core 控制台项目并解决了缺少的引用。为了弄清楚您需要为缺少的 API 添加哪些 API,我刚刚对缺少的成员执行了 F12(转到定义)在工作项目中,并使用所有引用查看 API 是在哪个程序集中定义的。

由于您在这里没有使用任何花哨的东西,所以 VS 中提供的 ASP.NET Core Web 应用程序 模板已经使用了所有这些 API,因此您可以将其用作“工作项目” .

例如 AddJsonFile 是在 Microsoft.Extensions.Configuration.Json 包中定义的。

所以最后我只剩下了

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="1.1.2" />
    <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="1.1.2" />
    <PackageReference Include="Newtonsoft.Json" Version="10.0.2" />
  </ItemGroup>

</Project>

发布时总计 2.41MB。

当然,您可能不想在更大的项目上这样做。 在这个项目上只需要一分钟左右。

关于c# - 最小占用空间/准系统 ASP.NET Core WebAPI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44356052/

相关文章:

c# - 生成 docx 文件的库 (Open XML)

c# - 在嵌入式代码中使用动态类型的 c# 变量

c# - ASP.NET Core 对 Azure 应用服务的缓慢 HTTP 请求

linux - 无法确定 Docker 中重定向的 https 端口

c# - 基本目录中的 DbMigration.SqlFile 差异

javascript - 更新 JavaScript 中的表单字段

c# - centos 8 上构建 docker 错误 :Encryption(ssl/tls) handshake failed

asp.net - ASP.NET 5、.NET Core 和 ASP.NET Core 5 之间有什么区别?

azure - FHIR服务器的认证和授权

asp.net-core-webapi - IIS Express 在哪里写入 VS2017/.NET Core 的日志文件?