首页 > 编程语言 >如何在WPF程序中启用ASP.NET Core的功能

如何在WPF程序中启用ASP.NET Core的功能

时间:2024-10-24 21:45:14浏览次数:8  
标签:Core ASP Hosting public Extensions using WPF Microsoft

本文介绍一种如何在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

相关文章

  • 如何在树梅派 Raspberry Pi 上搭建 RTSP Server(视频流服务器)
    本文以rpi4modelB为例,介绍如何搭建rtspserver。1.下载server压缩文件链接:https://sourceforge.net/projects/rtspsimpleserver.mirror/注意:如果rpi是32位 os,则选择"armv7";      如果rpi是64位 os,则选择"arm64v8"。2.提取内容       ......
  • cms 修改mysql密码忘记_aspcms忘记登陆密码 修改后台密码
    备份数据库:在进行任何数据库操作之前,请确保备份当前的数据库,以防止数据丢失。登录数据库:使用数据库管理工具(如phpMyAdmin)登录到你的数据库。找到用户表:寻找名为 Aspcms_Admins 的表,这是存储管理员账户信息的表。编辑用户记录:找到用户名为 admin 的记录......
  • WinForm 简单实现仿WPF的WrapPanel和StackPanel
    publicinterfaceIDesiredPanel{SizeGetDesiredSize(intavailableWidth,intavaiableHeight);}publicclassStackPanel:Panel,IDesiredPanel{protectedoverridevoidOnLayout(LayoutEventArgslevent){base.OnLayout(levent);......
  • 【磐维数据库】3.0运行"show events;"命令,引发集群主节点CoreDump
    一、环境介绍数据库PanWeiDBV2.0-S3.0.0_B01架构Intel+x86_64操作系统BCLinux-for-Euler-21.10内核4.19.90-2107.6.0.0192.8.oe1.bclinux.x86_64二、故障场景1、客户环境可以稳定复现gsql-rshowevents;\cbomcdb;--------业务库名称sh......
  • 使用qgis.core模块快速转换s57数据
    importosfromqgis.coreimport(QgsVectorLayer,QgsVectorFileWriter)#解析S57图层信息的函数defextract_s57_layer_info(s57layers:list[str])->list[tuple]:extracted_info=[]#内部的解析函数defparse_layer_info(layer_info)......
  • wsl ubuntu20.04设置core文件生成路径
    1.首先要确定允许生成core文件#在终端执行下列命令,执行后仅本次会话有效,如需每次都生效,可以添加到~/.bashrc文件中ulimit-cunlimited2.查看core文件的生成目录cat/proc/sys/kernel/core_pattern3.临时设置core文件的生成目录#先切换到root用户,然后输入,其中./表示生......
  • afcore.dll文件丢失影响Omega Strikers运行?Omega Strikers玩家必看afcore.dll文件丢失
    在沉浸于OmegaStrikers这款快节奏、竞技性强的游戏时,突然遭遇afcore.dll文件丢失的问题,无疑会给玩家带来不小的困扰。这一关键文件的缺失,可能导致游戏无法正常启动、运行卡顿,甚至频繁崩溃,严重影响游戏体验。然而,面对这一挑战,玩家无需过度焦虑,因为通过一系列自救措施,你完全有能......
  • wpf移除事件委托
    publicclassEventHandlerHelper{publicstaticDelegateGetEventDelegate(RoutedEventHandlerInfo[]rehis,stringmethod_name){foreach(RoutedEventHandlerInforhinrehis){if(rh.Handler.Meth......
  • api-ms-win-core-synch-l1-1-0.dll丢失怎么办?dll缺失解决方法
    当您遇到“api-ms-win-core-synch-l1-1-0.dll丢失”错误时,这通常意味着您的Windows系统中一个重要的动态链接库文件(DLL文件)缺失或损坏,这可能会影响到某些应用程序的正常运行。别担心,这个问题可以通过几个步骤来解决。下面是一份详细的指导文档,帮助您解决这一问题:api-ms-win-c......
  • 在iOS开发中如何使用Core Data管理数据持久化
    摘要:在iOS开发中运用CoreData管理数据持久化包括以下要点:1、掌握CoreData框架基础;2、实现数据模型的设计;3、熟悉数据存储与检索;4、利用上下文管理数据;5、数据迁移和版本控制。在这其中,数据模型的设计是核心,它影响整个应用的数据结构和未来的扩展性。数据模型设计指的是在Xcode中......