电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

.NET Core Web APi類庫內嵌運行的方法

瀏覽:165日期:2022-06-08 17:44:28
目錄
  • 話題
  • 內嵌運行.NET Core Web APi
  • 總結

話題

我們知道在.NET Framework中可以嵌入運行Web APi,那么在.NET Core(.NET 6+稱之為.NET)中如何內嵌運行Web Api呢,在實際項目中這種場景非常常見,那么我們本節以.NET 6.0作為演示示例一起來瞅瞅

內嵌運行.NET Core Web APi

接下來我們通過控制臺作為主程序來啟動Web APi,首先我們創建名為EmbedWebApi的控制臺程序,然后創建Embed.WebApi類庫運行Web APi,我們在此Web APi中創建如下接口,并實現相關方法來運行Web APi

public class InitTest : IInitTest{    public void Init()    {var builder = WebApplication.CreateBuilder();builder.Services.AddControllers();var app = builder.Build();app.UseRouting();app.UseEndpoints(endpoints => {    endpoints.MapDefaultControllerRoute();});app.Run();    }}public interface IInitTest{    void Init();}

通過寫接口并在對應方法中運行Web APi主要是達到在控制中調用該接口進行模擬實現,這里需要注意一點的是,因為我們創建的Web APi是類庫,要想使用Web里面的Api等等,直接在項目文件中添加如下一行以表明我們要引用框架,這樣一來框架里面所包含的APi等等版本都一致統一,而不是通過NuGet一一下載,這是錯誤的做法

<ItemGroup>    <FrameworkReference Include="Microsoft.AspNetCore.App" /></ItemGroup>

接下來我們在該類庫中按照規范創建Controllers文件夾,并創建測試控制器,如下

using Microsoft.AspNetCore.Mvc;namespace Embed.WebApi.Controllers{    [ApiController]    [Route("api/[controller]/[action]")]    public class TestController : ControllerBase    {[HttpGet]public IActionResult Test(){    return Ok("Hello World");}    }}

最后我們在控制臺程序中注冊上述接口并調用初始化方法,如下:

internal class Program{    static void Main(string[] args)    {var services = new ServiceCollection();services.AddTransient<IInitTest, InitTest>();var serviceProvider = services.BuildServiceProvider();var initTest = serviceProvider.GetRequiredService<IInitTest>();initTest.Init();Console.Read();    }}

蕪湖,我們通過Postman模擬調用測試接口,結果驚呆了,404了~~~

當我們將類庫中的控制器移動到控制臺中,此時請求測試接口并成功返回對世界的問候,這是什么原因呢? 不難猜測可知,默認WebAPi控制器的激活以作為入口的主程序集進行查找激活。雖然這樣看似解決了問題,假設調用嵌入運行的主程序是底層已經封裝好的基礎設施,那么豈不是遭到了代碼入侵,所以我們就想在運行的Web APi類庫里面去激活,此時我們想到將類庫作為Web APi應用程序一部分應用手動加載并激活,在初始化方法里面修改為如下即可請求測試接口成功

public class InitTest : IInitTest{    private static readonly string AssemblyName = typeof(InitTest).Assembly.GetName().Name;    public void Init()    {var builder = WebApplication.CreateBuilder();builder.Services.AddControllers()    .AddApplicationPart(Assembly.Load(new AssemblyName(AssemblyName)));var app = builder.Build();app.UseRouting();app.UseEndpoints(endpoints => {    endpoints.MapDefaultControllerRoute();});app.Run();    }}

上述直接在運行Web APi類庫中添加控制器激活,這種場景完全限定于底層主入口已封裝好,所以只能采用這種方式,若是主入口我們自己可控制,當然還有另外一種方式,來,我們瞧瞧截取的關鍵性源碼

/// <summary>/// Populates the given <paramref name="feature"/> using the list of/// <see cref="IApplicationFeatureProvider{TFeature}"/>s configured on the/// <see cref="ApplicationPartManager"/>./// </summary>/// <typeparam name="TFeature">The type of the feature.</typeparam>/// <param name="feature">The feature instance to populate.</param>public void PopulateFeature<TFeature>(TFeature feature){    if (feature == null)    {throw new ArgumentNullException(nameof(feature));    }    foreach (var provider in FeatureProviders.OfType<IApplicationFeatureProvider<TFeature>>())    {provider.PopulateFeature(ApplicationParts, feature);    }}internal void PopulateDefaultParts(string entryAssemblyName){    var assemblies = GetApplicationPartAssemblies(entryAssemblyName);    var seenAssemblies = new HashSet<Assembly>();    foreach (var assembly in assemblies)    {if (!seenAssemblies.Add(assembly)){    // "assemblies" may contain duplicate values, but we want unique ApplicationPart instances.    // Note that we prefer using a HashSet over Distinct since the latter isn"t    // guaranteed to preserve the original ordering.    continue;}var partFactory = ApplicationPartFactory.GetApplicationPartFactory(assembly);foreach (var applicationPart in partFactory.GetApplicationParts(assembly)){    ApplicationParts.Add(applicationPart);}    }}private static IEnumerable<Assembly> GetApplicationPartAssemblies(string entryAssemblyName){    var entryAssembly = Assembly.Load(new AssemblyName(entryAssemblyName));    // Use ApplicationPartAttribute to get the closure of direct or transitive dependencies    // that reference MVC.    var assembliesFromAttributes = entryAssembly.GetCustomAttributes<ApplicationPartAttribute>().Select(name => Assembly.Load(name.AssemblyName)).OrderBy(assembly => assembly.FullName, StringComparer.Ordinal).SelectMany(GetAssemblyClosure);    // The SDK will not include the entry assembly as an application part. We"ll explicitly list it    // and have it appear before all other assemblies \ ApplicationParts.    return GetAssemblyClosure(entryAssembly).Concat(assembliesFromAttributes);}private static IEnumerable<Assembly> GetAssemblyClosure(Assembly assembly){    yield return assembly;    var relatedAssemblies = RelatedAssemblyAttribute.GetRelatedAssemblies(assembly, throwOnError: false).OrderBy(assembly => assembly.FullName, StringComparer.Ordinal);    foreach (var relatedAssembly in relatedAssemblies)    {yield return relatedAssembly;    }}

從上述源碼可知,通過主入口程序集還會加載引用的程序集去查找并激活相關特性(比如控制器),當然前提是實現ApplicationPartAttribute特性,此特性必須在主入口程序集里定義,定義在程序集上,所以我們只需一行代碼即可搞定,我們在控制臺主入口命名空間頂部添加特性,引入Web APi類庫程序集作為應用程序的一部分,如下:

[assembly: ApplicationPart("Embed.WebApi")]

那么接下來問題又來了,要是需要運行多個Web APi我們又當如何呢?按照上述方式一一添加未嘗不可,我們也可以通過MSBuild任務來進行構建將相關特性自動添加到主入口程序集描述信息里面去,例如:

<ItemGroup>    <AssemblyAttribute Include="Microsoft.AspNetCore.Mvc.ApplicationParts.ApplicationPartAttribute"><_Parameter1>Embed.WebApi</_Parameter1>    </AssemblyAttribute></ItemGroup>

有的童鞋就問了,這不寫死了么,那還不如通過添加特性的方式去處理,請注意這里只是使用示例,實際情況下,我們可將多個Web APi放在同一解決方案下,然后在此解決方案下創建可構建任務的.targets文件,并在主項目文件里引入,將程序集名稱作為變量引入,剩下事情自行統一處理,若不清楚怎么搞,就在代碼中使用特性方式也未嘗不可,例如如下:

<ItemGroup>    <AssemblyAttribute Include="Microsoft.AspNetCore.Mvc.ApplicationParts.ApplicationPartAttribute"><_Parameter1>$(AssemblyName)</_Parameter1>    </AssemblyAttribute></ItemGroup>

總結

本節我們重點討論如何內嵌運行.NET Core Web APi類庫,同時介紹了兩種激活比如控制器特性方案, 希望對您有所幫助,謝謝,我們下節再會

到此這篇關于.NET Core Web APi類庫內嵌運行的方法的文章就介紹到這了,更多相關.NET Core Web APi內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!

標簽: ASP.NET
主站蜘蛛池模板: 合肥白癜风医院_合肥治疗白癜风医院_合肥看白癜风医院哪家好_合肥华研白癜风医院 | 采暖炉_取暖炉_生物质颗粒锅炉_颗粒壁炉_厂家加盟批发_烟台蓝澳采暖设备有限公司 | 河南包装袋厂家_河南真空袋批发价格_河南服装袋定制-恒源达包装制品 | 作文导航网_作文之家_满分作文_优秀作文_作文大全_作文素材_最新作文分享发布平台 | 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 镀锌角钢_槽钢_扁钢_圆钢_方矩管厂家_镀锌花纹板-海邦钢铁(天津)有限公司 | 水冷式工业冷水机组_风冷式工业冷水机_水冷螺杆冷冻机组-深圳市普威机械设备有限公司 | 干洗加盟网-洗衣店品牌排行-干洗设备价格-干洗连锁加盟指南 | TPE_TPE热塑性弹性体_TPE原料价格_TPE材料厂家-惠州市中塑王塑胶制品公司- 中塑王塑胶制品有限公司 | 深圳诚暄fpc首页-柔性线路板,fpc柔性线路板打样生产厂家 | 紫外线老化试验箱_uv紫外线老化试验箱价格|型号|厂家-正航仪器设备 | 存包柜厂家_电子存包柜_超市存包柜_超市电子存包柜_自动存包柜-洛阳中星 | 派克防爆伺服电机品牌|国产防爆伺服电机|高低温伺服电机|杭州摩森机电科技有限公司 | 粒米特测控技术(上海)有限公司-测功机_减速机测试台_电机测试台 | 逗网红-抖音网红-快手网红-各大平台网红物品导航 | 爆破器材运输车|烟花爆竹运输车|1-9类危险品厢式运输车|湖北江南专用特种汽车有限公司 | 闪蒸干燥机-喷雾干燥机-带式干燥机-桨叶干燥机-[常州佳一干燥设备] | 水篦子|雨篦子|镀锌格栅雨水篦子|不锈钢排水篦子|地下车库水箅子—安平县云航丝网制品厂 | 天津暖气片厂家_钢制散热器_天津铜铝复合暖气片_维尼罗散热器 | 空气能采暖,热泵烘干机,空气源热水机组|设备|厂家,东莞高温热泵_正旭新能源 | LED太阳能中国结|发光红灯笼|灯杆造型灯|节日灯|太阳能灯笼|LED路灯杆装饰造型灯-北京中海轩光电 | 「银杏树」银杏树行情价格_银杏树种植_山东程锦园林 | 知网论文检测系统入口_论文查重免费查重_中国知网论文查询_学术不端检测系统 | 全球化工设备网—化工设备,化工机械,制药设备,环保设备的专业网络市场。 | 成都离婚律师|成都结婚律师|成都离婚财产分割律师|成都律师-成都离婚律师网 | 集装箱标准养护室-集装箱移动式养护室-广州璟业试验仪器有限公司 | 氟塑料磁力泵-不锈钢离心泵-耐腐蚀化工泵厂家「皖金泵阀」 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 食品无尘净化车间,食品罐装净化车间,净化车间配套风淋室-青岛旭恒洁净技术有限公司 | 澳门精准正版免费大全,2025新澳门全年免费,新澳天天开奖免费资料大全最新,新澳2025今晚开奖资料,新澳马今天最快最新图库-首页-东莞市傲马网络科技有限公司 | 跨境物流_美国卡派_中大件运输_尾程派送_海外仓一件代发 - 广州环至美供应链平台 | 右手官网|右手工业设计|外观设计公司|工业设计公司|产品创新设计|医疗产品结构设计|EMC产品结构设计 | 污水提升器,污水提升泵,地下室排水,增压泵,雨水泵,智能供排水控制器-上海智流泵业有限公司 | 塑胶跑道_学校塑胶跑道_塑胶球场_运动场材料厂家_中国塑胶跑道十大生产厂家_混合型塑胶跑道_透气型塑胶跑道-广东绿晨体育设施有限公司 | 对辊破碎机-液压双辊式,强力双齿辊,四辊破碎机价格_巩义市金联机械设备生产厂家 | 广西资质代办_建筑资质代办_南宁资质代办理_新办、增项、升级-正明集团 | 在线钠离子分析仪-硅酸根离子浓度测定仪-油液水分测定仪价格-北京时代新维测控设备有限公司 | 华禹护栏|锌钢护栏_阳台护栏_护栏厂家-华禹专注阳台护栏、楼梯栏杆、百叶窗、空调架、基坑护栏、道路护栏等锌钢护栏产品的生产销售。 | 郑州大巴车出租|中巴车租赁|旅游大巴租车|包车|郑州旅游大巴车租赁有限公司 | 杭州门窗厂家_阳光房_包阳台安装电话-杭州窗猫铝合金门窗 | 广州展台特装搭建商|特装展位设计搭建|展会特装搭建|特装展台制作设计|展览特装公司 |