【发布时间】:2017-06-05 01:03:50
【问题描述】:
只是为了好玩,今天早些时候,我的一位同事问我是否可以尝试制作一个占用空间很小的 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 多行代码来完成这项工作,让我的同事大吃一惊,但是当我们查看文件大小时,它并没有那么令人印象深刻......
目前,有了所有这些依赖项,我的 WebAPI 正在编译为 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 3.1 December 2019 起,options.Nodelay =true 无效。
标签: c# asp.net-core asp.net-core-webapi