111,044
社区成员
请教很菜问题,我建一个WEB API服务,提供处理外部POST业务,我想建立C# windows应用程序,来启用WEB API服务并做一些其它业务处理?
/*
[assembly: System.Reflection.AssemblyCompanyAttribute("DingControl")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0")]
[assembly: System.Reflection.AssemblyProductAttribute("DingControl")]
[assembly: System.Reflection.AssemblyTitleAttribute("DingControl")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
[assembly: System.Runtime.Versioning.TargetPlatformAttribute("Windows7.0")]
[assembly: System.Runtime.Versioning.SupportedOSPlatformAttribute("Windows7.0")]
*/ 解决了,桌面程序可以启用了,
照做的,还是有错识呢
有要放假了,放假前都木啥事。闲着也是闲着,直接做个demo
public partial class Form1 : Form
{
private Lazy<IHost> webhost=new Lazy<IHost>(() => { return CreateHostBuilder().Build(); });
//这里是直接搬的programs的代码,看着也眼熟对吧
public static IHostBuilder CreateHostBuilder() =>
Host.CreateDefaultBuilder()
.ConfigureWebHostDefaults(webBuilder =>
{
//这里是新增的,我用Kestrel做http传输层,监听9527端口
webBuilder.UseKestrel(o => { o.ListenAnyIP(9527); });
webBuilder.UseStartup<Startup>();
});
public Form1()
{
InitializeComponent();
}
private async void button1_Click(object sender, EventArgs e)
{
//按你的要求,通过按钮启动他
await webhost.Value.StartAsync();
}
}
好了,点击按钮启动他,如果他没有异常的话,现在你可以打开浏览器访问了
访问结果是这样的
1.vs2019 新建net5 windows项目
2.nuget Microsoft.AspNetCore.Owin 版本5.0.15 该版本是net5支持
3.nuget Microsoft.AspNetCore.Server.Kestrel 版本是2.2.0,因为是net strand版本所以框架通用
//本身我们可以跟maui那样直接改造windows项目把整个windows都变成依赖通用 host的项目,不过因为是做demo,我就不打算那么做了
//我直接从Form1里开始写代码了
form1 放入一个button
public partial class Form1 : Form
{
private Lazy<IWebHost> webhost=new Lazy<IWebHost>(() =>
{
//其实这里的具体实现,你完全可以把你现在那个webapi的progarm.cs里的东西搬过来
//因为是演示,所以我不想写太多代码
WebHostBuilder webHostBuilder=new WebHostBuilder();
webHostBuilder.UseKestrel();//我直接启用kestrel做http传输层
webHostBuilder.ConfigureServices(service =>
{
////我不想写太多东西,所以这里我就不配了
});
webHostBuilder.ConfigureAppConfiguration(config =>
{
//我不想写太多东西,所以这里我就不配了
});
return webHostBuilder.Build();
});
public Form1()
{
InitializeComponent();
}
private async void button1_Click(object sender, EventArgs e)
{
//纯展示,我就不注入serverState这类了,你可以在上面实现整个单例去监控server运行状态
if (webhost.Value.Services.GetServices<serverState>().state)
{
//启动
await webhost.Value.StartAsync();
}
else
{
//停止
await webhost.Value.StopAsync();
}
}
}
}
我新起回复(那个回复的地方,貌似不让写代码)
不需要,你既然看到了这个代码,就无需拘泥。他能在program.cs里写 webhostBuilder,你为啥不可以在任何地方写呢
当然是可以的,如果我说,我可以在引用了那两个dll以后,我可以在一个winform 的form窗体里
Lazy webhost=//这里我省略builder过程
任何在你的button按钮事件里写
webhost.StartAsync() //启动他
webhost.StopAsync()//停止他
ps:代码我随手写的,你能明白意思就可以了
我还有点疑惑,我是VS2019 建立 Aap.NET Core Web Api 项目,产生产控制台程序,可以正常提供POST访问,
并不菜,在相当长的一段时间内那软都是分离策略,使用他的默认方案都是iis承载,只有在大概16年以后才跟着spring boot那样学习了通用host环境的owin---------spring boot很早就和tomcat脱钩了,他很早就可以使用任意server承载,甚至是一个控制台自我承载http
owin---通用http host环境,这样你可以在任意程序里承载http方面的处理,当然在传统课堂里和传统教程里,这种16年以后才出现的东西就不在那些资料里出现了
nuget:
Microsoft.AspNetCore.Owin
Microsoft.AspNetCore.Server.Kestrel
当你在你的windows程序里,直接nuget这两个库以后,他就可以自己承载http服务,也可以自己承载webapi,并且开发方式完全兼容你现在webapi(对,你可以直接把你现在的web api代码,原封不动的copy到windows程序里,这个windows程序自己就具备iis的功能,可以直接对外提供http服务)
基本开发方式
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/owin?view=aspnetcore-3.1
完全兼容现有的开发方式
如果你还是看不明白,那就看官办demo
https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/fundamentals/owin/sample
demo为你演示了怎么用控制台承载现有的asp.net-----------当然既然控制台都可以承载asp.net,你的windows自然也可以独立承载
ps:如果是net6的话,其实本身就已经无所谓用不用iis了,任意程序皆可以内置承载http