ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 最小的占用空间/裸机ASP.NET核心WebAPI

2019-06-08 09:01:31  阅读:234  来源: 互联网

标签:c asp-net-core asp-net-core-webapi


只是为了好玩,今天早些时候我的一位同事问我是否可以尝试制作一个使用ASP.NET Core回应请求的小型WebAPI.我能够在大约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添加哪些,我只是在工作项目中缺少的成员(转到定义)上做了F12,所有引用都参见了定义API的程序集.

由于您没有使用任何花哨的东西,因此VS中提供的ASP.NET核心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,asp-net-core-webapi
来源: https://codeday.me/bug/20190608/1196872.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有