引言

有段时间没有写博客了,不知道写什么,加上最近一直在玩单片机方面的东西,所以有一些懈怠。首先呢,为什么会有这么一个问题,是在一个QQ群里,有看到有人提问,能不能在启动Winform的同时去启动一个Web服务器去监听请求然后去做相应的业务处理,同时也可能存在和Winform之间的交互,然后也闲来无事,就动手实现了一下。

实现方式

在传统的Winform程序中,我们在程序中嵌套一个Webapi后端服务器的手段,是可以借助HttpListener去实现监听某一个指定的Url地址,使用BeginGetContext方法或者GetContext方法可以获取到我们请求的HttpListenerContext的上下文对象,里面包含了我们请求的信息,以及后续要写入的Response信息,从而实现一个Webapi的手段;不排除有人手撕socket自己在socket的基础上封装一个。

不过提这个问题的我倒没有看他是否要求是fw版本还是net6,所以我在Net6的基础上实现了一个,我们都知道,不管是Winform程序还是net6的Web程序,都是有一个Program类去启动程序或者Web程序,这两个,所依赖的SDK还有程序配置的默认的目标框架不一样,也就是TargetFramework,所以在Net6 Winform程序中,默认是无法使用Web相关的类以及接口的,同时就算是自己引入包也无法解决此问题,因为在5之后,Netstandard类库都转移统一版本net5或者6的一个大一统环境,所以自己去Nuget引入这些包也是不得解决。

解决方案其实也很简单,双击项目文件,编辑项目文件csproj,在最上方修改sdk为两个sdk都加上,这样也不会存在什么问题,同时TargetFrameworks设置为windows和net6.0,设置目标框架。同时还需要设置下面的TargetPlatformIdentifier为WINDOWS否则会报错提示,以及需要设置 UseWindowsForms,设置使用Winform,即可在Winform中启动一个Net6的WebApi程序,至于页面我没有测试,不过应该也开始可以的Program整体代码如下

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

  <PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFrameworks>net6.0-Windows;net6.0</TargetFrameworks>
<TargetPlatformIdentifier>WINDOWS</TargetPlatformIdentifier>
<Nullable>enable</Nullable>
<UseWindowsForms>True</UseWindowsForms>
<ImplicitUsings>enable</ImplicitUsings>
<StartupObject>Test.Program</StartupObject>
<EnforceCodeStyleInBuild>True</EnforceCodeStyleInBuild>
</PropertyGroup> <ItemGroup>
<None Include="..\.editorconfig" Link=".editorconfig" />
</ItemGroup> </Project>

Program

中间开启线程去启动Web程序,指定启动的地址,以及设置启动类,这些都可以根据自己的要求去设置

 internal static class Program
{
public static Form1 Form1 { get; set; }
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
// To customize application configuration such as set high DPI settings or default font,
// see https://aka.ms/applicationconfiguration.
#if WINDOWS
ApplicationConfiguration.Initialize();
#endif
Task.Run(() => {
Host.CreateDefaultBuilder(null)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseUrls("http://127.0.0.1:8989/");
webBuilder.UseStartup<Startup>();
}).Start();
});
#if WINDOWS
Form1 = new Form1();
Application.Run(Form1);
#endif
}
}

Startup

Startup文件就和之前net5的是一样的没有任何改动,对于Url映射什么也都没问题,如果需要和某个窗体做交互,建议在此处可以将所有的窗体注入进去,然后在对应的Controller去做交互即可,不同的界面不同的生命周期,但是必须和Winform窗体中,所要显示的是同一个对象。

 public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton(Program.Form1);
services.AddControllers();
services.AddRouting();
} // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app)
{
//app.Use(s => {
// return b =>
// {
// var n = Encoding.UTF8.GetBytes("12321321");
// return b.Response.Body.WriteAsync(n,0,n.Length);
// };
//});
app.UseRouting();
app.UseEndpoints(endpoints =>endpoints.MapControllers());
}
}

Controller

这些都是默认创建的Controller接口,程序启动后,调用接口则可以看到界面上的label控件发生改变,有兴趣的可以下载下来自己尝试尝试。

[ApiController]
[Route("[controller]")] public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
}; private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger, IConfiguration configuration,Form1 form1)
{
_logger = logger;
Form1 = form1;
} public Form1 Form1 { get; } [HttpGet("GetWeatherForecast")]
public IEnumerable<WeatherForecast> Get()
{
#if WINDOWS
Form1.label.Text=Guid.NewGuid().ToString();
#endif
return WeatherForecasts();
}
private IEnumerable<WeatherForecast> WeatherForecasts([CallerMemberName] string memberName = "",
[CallerFilePath] string sourceFilePath = "",
[CallerLineNumber] int sourceLineNumber = 0)
{ return Enumerable.Range(1, 5).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
}
}

结尾

感谢群里小伙伴提供的思路,让我能水一篇博客,哈哈,如果有对单片机感兴趣的也可以联系我,我会把我所知道的,倾囊相授。联系我可以在QQ群看有没有叫四川观察的,就是我,或者加QQ群6406277,也可以找到我。

代码地址:http://121.43.235.192:8082/s/dzib6ywpCncDfLG

【水一篇】骚操作之net 6的winform启动的同时启动Net 6 WebApi【同一套代码】的更多相关文章

  1. Java 12 骚操作, String居然还能这样玩!

    Java 13 都快要来了,12必须跟栈长学起! Java 13 即将发布,新特性必须抢先看! 栈长之前在Java技术栈微信公众号分享过<Java 11 已发布,String 还能这样玩!> ...

  2. switch多值匹配骚操作,带你涨姿势!

    我们都知道 switch 用来走流程分支,大多情况下用来匹配单个值,如下面的例子所示: /** * @from 微信公众号:Java技术栈 * @author 栈长 */ private static ...

  3. 开源项目在闲鱼、b 站上被倒卖?这是什么骚操作?

    起因 - 又是一封邮件 2020 年 3 月 2 日,收到了一封邮件,对,这次故事的起因又是一封邮件,和上次写个bug被国家信息安全漏洞共享平台抓到了一样. 这是一条评论通知邮件,一开始我以为只是正常 ...

  4. C#中的9个“黑魔法”与“骚操作”

    C#中的9个"黑魔法"与"骚操作" 我们知道C#是非常先进的语言,因为是它很有远见的"语法糖".这些"语法糖"有时过于好 ...

  5. 我天!xx.equals(null) 是什么骚操作??

    问题背景 我的天,最近做 Code Review 看到一个同事的骚操作,他写了一个工具类,大概是这样的: public static boolean isNull(Object object){ re ...

  6. [C#.NET 拾遗补漏]05:操作符的几个骚操作

    阅读本文大概需要 1.5 分钟. 大家好,这是极客精神[C#.NET 拾遗补漏]专辑的第 5 篇文章,今天要讲的内容是操作符. 操作符的英文是 Operator,在数值计算中习惯性的被叫作运算符,所以 ...

  7. 快来!我从源码中学习到了一招Dubbo的骚操作!

    荒腔走板 大家好,我是 why,欢迎来到我连续周更优质原创文章的第 55 篇. 老规矩,先来一个简短的荒腔走板,给冰冷的技术文注入一丝色彩. 魔幻的 2020 年的上半年过去了,很多人都在朋友圈和上半 ...

  8. 论减少代码中return语句的骚操作

    一.写作背景 最近组内在推行checkstyle代码规范的检测,关于checkstyle的介绍可以参考:https://checkstyle.sourceforge.io, 在按照checkstyle ...

  9. 5分钟GET我使用Github 5 年总结的这些骚操作!

    我使用 Github 已经有 5 年多了,今天毫无保留地把自己觉得比较有用的 Gihub 小技巧送给关注 JavaGuide 的各位小伙伴. 这篇文章肝了很久,就挺用心的,大家看内容就知道了. 如果觉 ...

  10. Redis 数据结构之字符串的那些骚操作

    Redis 字符串底层用的是 sds 结构,该结构同 c 语言的字符串相比,其优点是可以节省内存分配的次数,还可以... 这样写是不是读起来很无聊?这些都是别人咀嚼过后,经过一轮两轮三轮的再次咀嚼,吐 ...

随机推荐

  1. Navicat Premium多用户破解方法 12以上版本

    https://www.cnblogs.com/cgqplus/p/15267306.html 本文不提供注册机或者破解工具,本论坛多的是,搜索一下就好了. 本方法适用于多用户环境下使用,比如在服务器 ...

  2. table中td超出内容隐藏,鼠标悬停全部显示(完整版,含js代码)

    一.CSS语法: text-overflow:clip | ellipsis 默认值:clip 适用于:所有元素 clip: 当对象内文本溢出时不显示省略标记(...),而是将溢出的部分裁切掉. el ...

  3. 快速掌握服务网格系列二:云原生、K8S、服务网格(Service Mesh)及微服务之间的关系

    快速掌握服务网格系列二:云原生.K8S.服务网格(Service Mesh)及微服务之间的关系 首先看下CNCF对云原生的定义: Cloud native technologies empower o ...

  4. C++ 学习宝藏网站分享

    C++ 学习宝藏网站分享 1. C++ 在线参考手册 Cppreference https://zh.cppreference.com C++ 开发者必备的在线参考手册,是我最常访问的 C++ 网站之 ...

  5. 在xml中比较运算符

    SQL 中,可以使用比较运算符来比较两个值,如使用小于运算符 < 比较两个值大小.但是,在 SQL 查询中,有时候需要将小于运算符 < 用于 XML 或 HTML 语法中,这会导致语法冲突 ...

  6. 数仓性能优化:倾斜优化-表达式计算倾斜的hint优化

    本文分享自华为云社区<GaussDB(DWS)性能调优:倾斜优化-表达式计算倾斜的hint优化>,作者: 譡里个檔 . 1.原始SQL SELECT TMP4.TAX_AMT, CATE. ...

  7. 物联网常见协议之Amqp协议及使用场景解析

    摘要:本文围绕AMQP协议,为大家详细解析AMQP协议.核心技术亮点.多协议之间的对比以及使用实践. 本文分享自华为云社区<物联网常见协议之Amqp协议及使用场景解析>,作者:张俭. 引言 ...

  8. 遇到联邦计算数据碰撞难题怎么办?不妨试一试PSI

    摘要:随着MPC.隐私计算等概念的流行,诸多政府机构.金融企业开始考虑参与到多方计算的场景中,扩展数据的应用价值. 本文分享自华为云社区<使用PSI解决联邦计算的数据碰撞问题>,作者:br ...

  9. 看FusionInsight Spark如何支持JDBCServer的多实例特性

    摘要:采用多主实例模式的HA方案,不仅可以规避主备切换服务中断的问题,实现服务不中断或少中断,还可以通过横向扩展集群来提高并发能力. 本文分享自华为云社区<FusionInsight Spark ...

  10. .Net Core 开发框架,支持多版本的类库

    工具:Visual Studio 2019 1.新建一个 .NET Standard 类库. 2.填写项目名称 3.编辑项目文件 可以看到当前类库默认为 netstandard2.0,而此时其xml标 ...