本文介绍一种如何在WPF程序中启用ASP.NET Core功能的方法
关于ASP.NET Core,如果之前不太了解,那么简介就是
ASP.NET Core 是一个跨平台、高性能的开源框架,用于构建支持云的现代 Internet 连接应用程序。
简单来说,就是启用web服务器的功能,以实现Web API, 亦或是Razor网页等功能。(个人来说;Web API是最为常用的功能,因为这是常见的软件通信手段,对于交互来说非常有用)
如果在读者了解到这种方式前有接触过类似的需求,可能会在网络上搜索到使用 HttpListener 这个类创建http服务器的方法,但这种方法通常会遇到,代码复杂,权限不足等各式各样的问题,个人来说不推荐在实际环境中使用这种方法,以下为一段官方代码示例:
public static void SimpleListenerExample(string[] prefixes)
{
// 检查 HttpListener 是否受支持
if (!HttpListener.IsSupported)
{
Console.WriteLine("使用 HttpListener 类需要 Windows XP SP2 或 Server 2003。");
return;
}
// URI 前缀是必需的,
// 例如 "http://contoso.com:8080/index/"。
if (prefixes == null || prefixes.Length == 0)
throw new ArgumentException("prefixes");
// 创建一个监听器
HttpListener listener = new HttpListener();
// 添加前缀
foreach (string s in prefixes)
{
listener.Prefixes.Add(s);
}
listener.Start();
Console.WriteLine("正在监听...");
// 注意:GetContext 方法在等待请求时会阻塞
HttpListenerContext context = listener.GetContext();
HttpListenerRequest request = context.Request;
// 获取响应对象
HttpListenerResponse response = context.Response;
// 构造响应
string responseString = "<HTML><BODY> 你好,世界!</BODY></HTML>";
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(responseString);
// 获取响应流并将响应写入其中
response.ContentLength64 = buffer.Length;
System.IO.Stream output = response.OutputStream;
output.Write(buffer, 0, buffer.Length);
// 必须关闭输出流
output.Close();
listener.Stop();
}
“欸?好麻烦啊,我不想一直写这么复杂的代码”
没错,这种方式不但容易出错,不易于管理,也不现代化。在最早之前我们使用一次之后,就开始另寻替代之法。
--------------
是的,我们想到了ASP.NET Core
”要是有一种方法能够在WPF中使用这个功能就好了“,我们这么想着,于是便找到了方法。
首先,打开我们的控制台创建我们的项目,当然也可以采用Visual Studio或者其他任何方法创建
dotnet new wpf -o WpfAppWithASP
cd WpfAppWithASP # 进入目录
安装所需要的软件包,在这里我们采用指令。使用nuget包管理器当然也是可以的
dotnet add package Microsoft.Extensions.DependencyInjection --version 8.0.0
dotnet add package Microsoft.Extensions.Hosting --version 8.0.0
dotnet add package Microsoft.Extensions.Hosting.Abstractions --version 8.0.0
dotnet add package Microsoft.Extensions.Logging --version 8.0.0
接下来的这步,没有办法在命令行中进行操作(至少在写稿之时我还没有发现)
打开项目配置文件 WpfAppWithAsp.csproj
添加一个新的ItemGroup引入AspNetCore的框架
<!-- WpfAppWithAsp.csproj -->
<ItemGroup>
<FrameworkReference Include="Microsoft.AspNetCore.App" />
</ItemGroup>
此时我们的软件就具备了所需要能力
打开App.xaml.cs, 修改为// App.xaml.cs
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using System.Net;
using System.Windows;
namespace WpfAppWithASP
{
/// <summary>
/// Interaction logic for App.xaml
/// </summary>
public partial class App : Application
{
IHost _host;
public App()
{
_host = Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
})
.Build();
_host.Start();
}
}
}
最后创建Startup.cs
// Startup.cs
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
namespace WpfAppWithASP
{
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
}
public void Configure(IApplicationBuilder app)
{
app.UseRouting();
app.UseEndpoints(routes =>
{
routes.MapControllers();
});
}
}
public class HomeController
{
[HttpGet("/")]
public string Get() => "Hello World";
}
}
为了更容易看到果,我们将软件的输出类型变为Exe
<!-- WpfAppWithAsp.csproj -->
<PropertyGroup>
<OutputType>Exe</OutputType> <!-- 这里原本为WinExe -->
<TargetFramework>net8.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UseWPF>true</UseWPF>
</PropertyGroup>
这时候 启动软件,如果看到了类似这样的输出
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://localhost:37792
info: Microsoft.Hosting.Lifetime[14]
Now listening on: http://localhost:37793
info: Microsoft.Hosting.Lifetime[0]
那么恭喜你,大功告成
由于我们刚刚的代码已经创建了一个简单的Api,这时候我们可以直接浏览器访问日志中出现的链接,应该可以看到Hello World的出现。完成!
当然appsetting.json也是可以使用的, 附上我们的appsetting
{
"AllowedHosts": "*",
"Logging": {
"LogLevel": {
"Default": "Information",
"System.Net.Http.HttpClient": "Warning"
}
},
"Kestrel": {
"Endpoints": {
"Http": {
"Url": "http://localhost:37792"
},
"Https": {
"Url": "http://localhost:37793"
}
}
}
}
学会了吗?学会了(不是)
视频链接:【C#练习】在WPF中启用ASP.NET Core的功能
微信公众号搜索:scixing的炼丹房
标签:Core,ASP,Hosting,public,Extensions,using,WPF,Microsoft From: https://blog.csdn.net/scixing/article/details/143103916