ASP.NET Core路由中间件[1]: 终结点与URL的映射

2024-01-04

一、路由注册

我们演示的这个ASP.NET Core应用是一个简易版的天气预报站点。如果用户希望获取某个城市在未来 N 天之内的天气信息,他可以直接利用浏览器发送一个GET请求并将对应城市(采用电话区号表示)和天数设置在URL中。如下图所示,为了得到成都未来两天的天气信息,我们将发送请求的路径设置为“weather/028/2”。对于采用路径“weather/0512/4”的请求,返回的自然就是苏州未来4天的天气信息。

15-1

为了开发这个简单的应用,我们定义了如下所示的WeatherReport类型,表示某个城市在某段时间范围内的天气。如下面的代码片段所示,我们还定义了另一个WeatherInfo类型,表示具体某一天的天气。简单起见,我们让WeatherInfo对象只携带基本天气状况和气温区间的信息。创建一个WeatherReport对象时,我们会随机生成这些天气信息。

public class WeatherReport
{
    private static string[] _conditions = new string[] { "晴", "多云", "小雨" };
    private static Random _random = new Random();

    public string City { get; }
    public IDictionary<DateTime, WeatherInfo> WeatherInfos { get; }

    public WeatherReport(string city, int days)
    {
        City = city;
        WeatherInfos = new Dictionary<DateTime, WeatherInfo>();
        for (int i = 0; i < days; i++)
        {
            WeatherInfos[DateTime.Today.AddDays(i + 1)] = new WeatherInfo
            {
                Condition = _conditions[_random.Next(0, 2)],
                HighTemperature = _random.Next(20, 30),
                LowTemperature = _random.Next(10, 20)
            };
        }
    }

    public WeatherReport(string city, DateTime date)
    {
        City = city;
        WeatherInfos = new Dictionary<DateTime, WeatherInfo>
        {
            [date] = new WeatherInfo
            {
                Condition = _conditions[_random.Next(0, 2)],
                HighTemperature = _random.Next(20, 30),
                LowTemperature = _random.Next(10, 20)
            }
        };
    }

    public class WeatherInfo
    {
        public string Condition { get; set; }
        public double HighTemperature { get; set; }
        public double LowTemperature { get; set; }
    }
}

由于用于处理请求的处理器最终体现为一个RequestDelegate对象,所以我们定义了如下一个与这个委托类型具有一致声明的WeatherForecast方法来处理对应的请求。如下面的代码片段所示,我们在这个方法中直接调用HttpContext的GetRouteData扩展方法提取RoutingMiddleware中间件在路由解析过程中设置的路由参数。GetRouteData扩展方法返回的是一个具有字典结构的对象,它的Key和Value分别代表路由参数的名称与值,通过预先定义的参数名(city和days)可以得到目标城市和预报天数。

public class Program
{
    private static Dictionary<string, string> _cities = new Dictionary<string, string>
    {
        ["010"] = "北京",
        ["028"] = "成都",
        ["0512"] = "苏州"
    };

    public static async Task WeatherForecast(HttpContext context)
    {
        var city = (string)context.GetRouteData().Values["city"];
        city = _cities[city];
        int days = int.Parse(context.GetRouteData().Values["days"].ToString());
        var report = new WeatherReport(city, days);
        await RendWeatherAsync(context, report);
    }

    private static async Task RendWeatherAsync(HttpContext context, WeatherReport report)
    {
        context.Response.ContentType = "text/html;charset=utf-8";
        await context.Response.WriteAsync("<html><head><title>Weather</title></head><body>");
        await context.Response.WriteAsync($"<h3>{report.city}</h3>");
        foreach (var it in report.WeatherInfos)
        {
            await context.Response.WriteAsync($"{it.Key.ToString("yyyy-MM-dd")}:");
            await context.Response.WriteAsync($"{it.Value.Condition}({ it.Value.LowTemperature}℃ ~ { it.Value.HighTemperature}℃)< br />< br /> ");
        }
        await context.Response.WriteAsync("</body></html>");
    }    
    ...
}

有了这两个核心参数之后,我们可以据此生成一个WeatherReport对象,并将它携带的天气信息以一个HTML文档的形式响应给客户端,图15-1就是这个HTML文档在浏览器上的呈现效果。由于目标城市最初以电话区号的形式体现,所以在呈现天气信息的过程中我们还会根据区号获取具体城市的名称。简单起见,我们利用一个简单的字典来维护区号和城市之间的关系,并且只存储了3个城市而已。

下面完成所需的路由注册工作。如下面的代码片段所示,我们调用IApplicationBuilder的UseRouting方法和UseEndpoints方法分别完成针对EndpointRoutingMiddleware与EndpointMiddleware这两个终结点的注册。由于它们在进行路由解析过程中需要使用一些服务,所以可以调用IServiceCollection的AddRouting扩展方法来对它们进行注册。

public class Program
{
    public static void Main()
    {
        Host.CreateDefaultBuilder()
            .ConfigureWebHostDefaults(builder => builder
                .ConfigureServices(svcs => svcs.AddRouting())
                .Configure(app => app
                    .UseRouting()
                    .UseEndpoints(endpoints=> endpoints.MapGet("weather/{city}/{days}", WeatherForecast))))
            .Build()
            .Run();
    }
}

UseEndpoints方法提供了一个Action<IEndpointRouteBuilder>类型的参数,我们利用这个参数调用IEndpointRouteBuilder的MapGet方法提供了一个路由模板与对应处理器之间的映射。我们指定的路径模板为“weather/{city}/{days}”,其中携带两个路由参数({city}和{days}),分别代表获取天气预报的目标城市和天数。由于针对天气请求的处理实现在WeatherForecast方法中,所以将指向这个方法的RequestDelegate对象作为第二个参数。MapGet的后缀“Get”表示HTTP方法,这意味着与指定路由模板的模式相匹配的GET请求才会被路由到WeatherForecast方法对应的终结点。

二、设置内联约束

上面的演示实例注册的路由模板中定义了两个参数({city}和{days}),分别表示获取天气预报的目标城市对应的区号和天数。区号应该具有一定的格式(以零开始的3~4位数字),而天数除了必须是一个整数,还应该具有一定的范围。由于我们在注册的时候并没有为这个两个路由参数的值做任何约束,所以请求URL携带的任何字符都是有效的。而处理请求的WeatherForecast方法也并没有对提取的数据做任何验证,所以在执行过程中面对不合法的输入会直接抛出异常。如下图所示,由于请求URL(“/weather/0512/iv”)指定的天数不合法,所以客户端接收到一个状态为“500 Internal Server Error”的响应。

15-2

为了确保路由参数值的有效性,在进行路由注册时可以采用内联(Inline)的方式直接将相应的约束规则定义在路由模板中。ASP.NET Core为常用的验证规则定义了相应的约束表达式,我们可以根据需要为某个路由参数指定一个或者多个约束表达式。如下面的代码片段所示,为了确保URL携带的是合法的区号,我们为路由参数{city}指定了一个针对正则表达式的约束(:regex(^0[1-9]{ {2,3}}$))。由于路由模板在被解析时会将{value}这样的字符理解为路由参数,如果约束表达式需要使用字符“{}”(如正则表达式^0[1-9]{2,3}$)),就需要采用“{ {}}”进行转义。而路由参数{days}则应用了两个约束:第一个是针对数据类型的约束(:int),它要求参数值必须是一个整数;第二个是针对区间的约束(:range(1,4)),意味着我们的应用最多只提供未来4天的天气。

public class Program
{
    public static void Main()
    {
        var template = @"weather/{city:regex(^0\d{{2,3}}$)}/{days:int:range(1,4)}";
        Host.CreateDefaultBuilder()
            .ConfigureWebHostDefaults(builder => builder
                .ConfigureServices(svcs => svcs.AddRouting())
                .Configure(app => app
                    .UseRouting()
                    .UseEndpoints(routes => routes.MapGet(template, WeatherForecast))))
            .Build()
            .Run();    
    }
    ...
}

如果在注册路由时应用了约束,那么RoutingMiddleware中间件在进行路由解析时除了要求请求路径必须与路由模板具有相同的模式,还要求携带的数据满足对应路由参数的约束条件。如果不能同时满足这两个条件,RoutingMiddleware中间件将无法选择一个终结点来处理当前请求,在此情况下它会将请求直接递交给后续中间件进行处理。对于我们演示的这个实例来说,如果提供的是一个不合法的区号(1024)和预报天数(5),那么客户端都将得到下图所示的状态码为“404 Not Found”的响应。

15-3

三、默认路由参数

路由注册时提供的路由模板(如“weather/{city}/{days}”)可以包含静态的字符(如weather),也可以包含动态的参数(如{city}和{days}),我们将后者称为路由参数。并非每个路由参数都是必需的,有的路由参数是默认的。还是以上面演示的实例来说,我们可以采用如下方式在路由参数名后面添加一个问号(?)将原本必需的路由参数变成可以默认的。默认的路由参数只能出现在路由模板尾部,这个应该不难理解。

public class Program
{    
    public static void Main()
    {
        var template = "weather/{city?}/{days?}";
        Host.CreateDefaultBuilder()
            .ConfigureWebHostDefaults(builder => builder
                .ConfigureServices(svcs => svcs.AddRouting())
                .Configure(app => app
                    .UseRouting()
                    .UseEndpoints(routes => routes.MapGet(template, WeatherForecast))))
            .Build()
            .Run();
    }
    ...
}

既然路由变量占据的部分路径是可以默认的,那么即使请求的URL不具有对应的内容(如“weather”和“weather/010”),它与路由规则也是匹配的,但此时在路由参数字典中是找不到它们的。由于表示目标城市和预测天数的两个路由参数都是默认的,所以需要对处理请求的WeatherForecast方法做相应的改动。下面的代码片段表明:如果请求URL为了显式提供对应参数的数据,那么它们的默认值分别为010(北京)和4(天),也就是说,应用默认提供北京未来4天的天气。

public class Program
{    
    public static async Task WeatherForecast(HttpContext context)
    {
        var routeValues = context.GetRouteData().Values;
        var city = routeValues.TryGetValue("city", out var v1)
            ? (string)v1
            : "010";
        city = _cities[city];
        var days = routeValues.TryGetValue("days", out var v2)
            ? int.Parse(v2.ToString())
            : 4;          
        var report = new WeatherReport(city, days); 
        await RendWeatherAsync(context, report);
    }
    ...
}

针对上述改动,如果希望获取北京未来4天的天气状况,我们可以采用下图所示的3种URL(“weather”、“weather/010”和“weather/010/4”),它们是完全等效的。

15-4

上面的程序相当于在进行请求处理时给予了默认路由参数一个默认值,实际上,路由参数默认值的设置还有一种更简单的方式,那就是按照如下所示的方式直接将默认值定义在路由模板中。如果采用这样的路由注册方式,针对WeatherForecast方法的改动就完全没有必要。

public class Program
{
    public static void Main()
    {
        var template = "weather/{city=010}/{days=4}";
        Host.CreateDefaultBuilder()
            .ConfigureWebHostDefaults(builder => builder
                .ConfigureServices(svcs => svcs.AddRouting())
                .Configure(app => app
                    .UseRouting()
                    .UseEndpoints(routes => routes.MapGet(template, WeatherForecast))))
            .Build()
            .Run();
    }
    ...
}

四、特殊的路由参数

一个URL可以通过分隔符“/”划分为多个路径分段(Segment),路由模板中定义的路由参数一般来说会占据某个独立的分段(如“weather/{city}/{days}”)。但也有例外情况,我们既可以在一个单独的路径分段中定义多个路由参数,也可以让一个路由参数跨越多个连续的路径分段。

下面先介绍在一个独立的路径分段中定义多个路由参数的情况。同样以前面演示的获取天气预报的路径为例,假设设计一种路径模式来获取某个城市某一天的天气信息,如“/weather/010/2019.11.11”这样一个URL可以获取北京在2019年11月11日的天气,那么路由模板为“/weather/{city}/{year}.{month}.{day}”。

public class Program
{
    public static void Main()
    {
        var template = "weather/{city}/{year}.{month}.{day}";
        Host.CreateDefaultBuilder().ConfigureWebHostDefaults(builder => builder
            .ConfigureServices(svcs => svcs.AddRouting())
            .Configure(app => app.UseRouter(builder => builder.MapGet(template, WeatherForecast))))
            .Build()
            .Run();
    }

    public static async Task WeatherForecast(HttpContext context)
    {
        var values = context.GetRouteData().Values;
        var city = values["city"].ToString();
        city = _cities[city];
        int year = int.Parse(values["year"].ToString());
        int month = int.Parse(values["month"].ToString());
        int day = int.Parse(values["day"].ToString());
        var report = new WeatherReport(city, new DateTime(year, month, day));
        await RendWeatherAsync(context, report);
    }
    ...
}

由于URL采用了新的设计,所以我们按照如上形式对相关程序进行了相应的修改。现在我们采用“/weather/{city}/{yyyy}.{mm}.{dd}”这样的URL,就可以获取某个城市指定日期的天气。如下图所示,我们采用请求路径“/weather/010/2019.11.11”可以获取北京在2019年11月11日的天气。

15-5

对于上面设计的这个URL来说,我们采用“.”作为日期分隔符,如果采用“/”作为日期分隔符(如2019/11/11),这个路由默认应该如何定义?由于“/”也是路径分隔符,如果表示日期的路由变量也采用相同的分隔符,就意味着同一个路由参数跨越了多个路径分段,我们只能采用定义“通配符”的形式来达到这个目的。通配符路由参数采用{*variable}或者{**variable}的形式,星号(*)表示路径“余下的部分”,所以这样的路由参数只能出现在模板的尾端。对我们的实例来说,路由模板可以定义成“/weather/{city}/{*date}”。

public class Program
{
    public static void Main()
    {
        var template = "weather/{city}/{*date}";
        Host.CreateDefaultBuilder()
            .ConfigureWebHostDefaults(builder => builder
                .ConfigureServices(svcs => svcs.AddRouting())
                .Configure(app => app
                    .UseRouting()
                    .UseEndpoints(routes => routes.MapGet(template, WeatherForecast))))
            .Build()
            .Run();
    }

    public static async Task WeatherForecast(HttpContext context)
    {
        var values = context.GetRouteData().Values;
        var city = values["city"].ToString();
        city = _cities[city];
        var date = DateTime.ParseExact(values["date"].ToString(), "yyyy/MM/dd", CultureInfo.InvariantCulture);
        var report = new WeatherReport(city, date);
        await RendWeatherAsync(context, report);
    }
    ...
}

我们可以对程序做如上修改来使用新的URL模板(“/weather/{city}/{*date}”)。为了得到北京在2019年11月11日的天气,请求的URL可以替换成“/weather/010/2019/11/11”,返回的天气信息如下图所示。

15-6

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET Core路由中间件[1]: 终结点与URL的映射 的相关文章

  • 在 C# ASP.NET 中添加自定义 hashAlgorithmType

    我有一个页面需要加强安全性 我正在使用内置的 MembershipProvider 功能 目前有hashAlgorithmType设置为 SHA512 我有 BCrypt NET 库 http bcrypt codeplex com 当我从
  • 动态生成的控件 ID 返回为 NULL

    我可以在 Page PreInit 函数中创建动态控件 如何检索控件及其 ID 我的 C 代码用于创建动态控件之一 var btn new WebForms Button btn Text btn ID Addmore btn Click
  • 如何在服务器端按钮点击时关闭当前标签页?

    我尝试在确认后关闭当前选项卡 因此我将以下代码放在确认按钮的末尾 但选项卡没有关闭 string jScript ClientScript RegisterClientScriptBlock this GetType keyClientBl
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • 根据所选单选按钮启用文本框

    我有一个单选按钮列表 其中列出了不同的业务类别 最后一个选项是Other类别 当用户选择Other类别 我希望能够启用一个文本框 用户可以输入更多信息来解释Other选择 目前 我正在尝试 If rblCategory SelectedIn
  • Global.asax PostAuthenticateRequest 事件绑定是如何发生的?

    我怎样才能使用发布验证请求Global asax 事件 我正在跟进本教程 http www asp net security tutorials forms authentication configuration and advanced
  • If else 在 Web 网格列中

    如何在 webgrid 列中添加条件 if else grid GetHtml tableStyle table table bordered columns grid Columns grid Column RealName Name g
  • DateTime.Parse("2012-09-30T23:00:00.0000000Z") 始终转换为 DateTimeKind.Local

    我想解析一个表示 UTC 格式的日期时间的字符串 我的字符串表示形式包括 Zulu 时间规范 该规范应指示该字符串表示 UTC 时间 var myDate DateTime Parse 2012 09 30T23 00 00 0000000
  • idleTimeout 和 ShutdownTimeout 之间的区别

    我正在尝试放宽网站的会话过期策略 以便用户可以指定会话超时间隔 我需要弄清楚应该指定哪些网站相关设置 以免过多限制用户 例如 可能需要 1 天的间隔 我将使用门票来实现这一点 现在 我知道我可以在网站的 web config 文件中指定id
  • 两个日期范围之间相交的天数

    有人知道如何最好地计算两个日期范围之间相交的天数吗 这是我写的一个小方法来计算这个 private static int inclusiveDays DateTime s1 DateTime e1 DateTime s2 DateTime
  • 如何在新窗口中打开图像或pdf文件?

    我有一个 gridview 它包含文件名和文件路径 图像和 pdf 格式文件 其中我使用了模板字段 在该字段下放置了 1 个图像按钮 单击该图像按钮 即 查看 按钮 时 我想在新窗口中打开所选文件 这是我的代码 protected void
  • Chrome 浏览器不显示 HTTP 处理程序生成的图像

    基本上我有一个网站 可以呈现一些文档 主要是办公室 的 HTML 预览 生成的 HTML 片段包含在同一网站返回的页面中 但图像由 HTTP 处理程序从具有以下链接的另一个网站返回 img width 50 height 50 src ht
  • 管理调试和发布连接字符串

    在 NET SQLServer 应用程序中管理调试和发布连接字符串的好方法是什么 我有两个 SQL Server 一个是生产服务器 一个是构建 调试服务器 我需要一种在部署 ASP NET 应用程序时在这两个服务器之间进行切换的方法 目前
  • 检测到 NuGet 包的版本冲突

    我正在开发 ASP Net core 2 1 Web 应用程序项目 我的解决方案中有 1 个项目和 3 个其他库 它是高级架构 数据访问层 DAL 业务层 BL 公共层 CL 所以我需要添加引用来连接一些库和项目 我已经添加了CL参考我的项
  • 无法访问本地 Docker 容器上的 Asp.Net Core

    我在 asp net core 中创建了一个应用程序 并创建了一个 dockerfile 来生成本地映像并运行它 FROM microsoft dotnet latest COPY app WORKDIR app RUN dotnet re
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • 在 gridview 控件中使用单选按钮

    我有一个 gridview 控件 其中使用存储过程显示数据 该网格有三列 第一列包含单选按钮 总体思路是用户应该能够从 在我的例子中 5 个单选按钮中仅选择一个单选按钮 当前功能的问题是我可以同时选择所有单选按钮 我尝试使用 groupna
  • 动态 C#.NET Web 服务

    我在 C ASP NET 项目中使用一个类 允许用某种随机脚本语言编写的脚本动态公开 Web 服务方法 换句话说 该脚本应该能够公开具有任何签名的任何名称的方法 只要因为它是有效的 无论如何 通过这个 SOAP 接口向外界发送 能够随意添加
  • 获取GridView中选定行的索引

    我想使用复选框获取从 gridview 选择的行 复选框是这样的
  • oracle ExecuteNonQuery 在 ASP.Net 上冻结

    我正在尝试使用 ASP C 和 CLR 4 5 中的 Oracle 连接来运行非查询 这是我的代码 string connectionString ConfigurationManager ConnectionStrings OracleC

随机推荐

  • 用于预处理器 #if 语句的工具/解析器?

    我正在处理许多包含许多预处理器的 C 源代码文件 if elseif and else声明 该语句经常检查 define e g if Switch TestMode Switch TestModeON code 1 else code 2
  • 为什么枚举类型上的私有字段对包含类可见?

    public class Parent public enum ChildType FIRST CHILD I am the first SECOND CHILD I am the second private String myChild
  • 从饼图获取图例中的百分比 matplotlib 饼图

    我使用下面的 matplotlib 创建了一个饼图 import matplotlib pyplot as plt labels dogs cats birds fish sizes 34 24 18 13 pie plt pie size
  • 数据查询:查找具有某些值的所有实体

    通过这个查询 find e where e db valueType db type string 我可以找到属性名为的所有实体 db valueType和价值 db type string 在我的例子中 数据库中有一些数据 它返回十个 I
  • 如何快速编写和运行小型 C# 代码

    有时我想测试论坛上的新代码 或者需要帮助我的朋友解决特定的 C 问题 问题是我不想每次都在 Visual Studio 中创建新的 项目 只是为了编码 运行这个小代码 Java 和 Eclipse IDE 提供了 剪贴簿 功能 允许执行任意
  • 使用绑定.xml 重命名 JAXB 根​​类

    我使用 Eclipse 中的 Dali 插件使用 xsd 文件生成 Java 类 该文件本质上只是在架构文件上调用 xjc 我使用了建议here http blog bdoughan com 2011 07 jaxb xjc and nes
  • 如何在 SQL Server 中将日期时间字符串转换为日期时间

    我有一个以下格式的 DateTime varchar 2005 08 08T00 00 00 01 00 这种格式有名字吗 不是 ISO8601 是 RFC3339 吗 如何使用 Transact Sql 将其转换为 DateTime ED
  • std::set.find() 返回的迭代器存在多久?

    我需要通过保存 set find 返回的迭代器来跟踪 std set 元素 我的问题是插入和删除otherelements 使获得的迭代器无效 从我所做的简单测试中我可以看出事实并非如此 但我想确保此功能是设计使然 它永远不会使迭代器或元素
  • 创意无限,绘图轻松——Sketch for Mac矢量绘图软件全面介绍

    在现代设计领域 矢量绘图软件是设计师们必不可少的工具之一 而在众多矢量绘图软件中 Sketch for Mac凭借其强大的功能和友好的用户界面脱颖而出 成为众多设计师的首选 Sketch for Mac是一款专为Mac用户开发的矢量绘图软件
  • 「实战应用」如何用DHTMLX Gantt构建类似JIRA式的项目路线图(一)

    DHTMLX Gantt 是用于跨浏览器和跨平台应用程序的功能齐全的Gantt图表 可满足项目管理应用程序的所有需求 是最完善的甘特图图表库 在web项目中使用DHTMLX Gantt时 开发人员经常需要满足与UI外观相关的各种需求 因此他
  • 如何使用Urllib库采集体育头条数据

    你可以使用urllib库来发送HTTP请求并获取体育头条数据 以下是一个基本的示例 展示如何使用urllib来获取数据 import urllib request def fetch sports news url https www sp
  • 操作系统题库

    单选题 单选题 下列关于操作系统的说法中 错误的是 I 在通用操作系统管理下的计算机上运行程序 需要向操作系统预定运行时间 II 在通用操作系统管理下的计算机上运行程序 需要确定起始地址 并从这个地址开始执行 III 操作系统需要提供高级程
  • 【人工智能领域优质书籍】实战AI大模型

    文末送书 今天推荐一本人工智能领域好书 实战AI大模型 文章目录 导语 书籍亮点 初学者必备 文末送书 导语 人工智能领域资深专家尤洋老师倾力打造 获得了李开复 周鸿祎 颜水成三位大咖鼎力推荐 一经上市就登上了京东 计算机与互联网 图书排行
  • JProfiler for Mac/win中文版:功能强大的性能分析工具

    在当前的软件开发领域 Java语言是最为广泛使用的编程语言之一 然而 随着应用程序规模的增长和复杂性的提高 开发人员们经常面临着性能问题 为了解决这些问题 JProfiler作为一款专业的Java性能分析工具应运而生 JProfiler是一
  • 一文搞懂SiLM824x系列SiLM8243BBCL-DG 双通道死区可编程隔离驱动 主要特性与应用 让技术变得更有价值

    SiLM824x系列SiLM8243BBCL DG是一款具有不同配置的隔离双通道门极驱动器 SiLM8243BBCL DG配置为高 低边驱动 SiLM8243BBCL DG可提供4A的输出源电流和6A的灌电流能力 并且其驱动输出电压可以支持
  • 联邦学习:在保护数据隐私的前提下进行分布式机器学习的方法

    随着大数据时代的到来 机器学习正成为各个领域中重要的工具和技术 然而 传统的机器学习方法通常需要集中式地收集和处理大量的数据 这可能涉及到用户的隐私问题 为了解决这一问题 联邦学习应运而生 联邦学习是一种分布式机器学习的方法 它允许在保护数
  • LeetCode 2397. 被列覆盖的最多行数,状态压缩优化回溯法

    一 题目 1 题目描述 给你一个下标从 0 开始 大小为 m x n 的二进制矩阵 matrix 另给你一个整数 numSelect 表示你必须从 matrix 中选择的 不同 列的数量 如果一行中所有的 1 都被你选中的列所覆盖 则认为这
  • 通过Java编程提取Word文档的文本

    提取Word文档中的文本是一种常见的操作 便于单独获取Word文档中的内容以进行进一步的处理 分析等操作 我们可以直接复制并粘贴保存到指定文件中 但这一方法一般适用于文本内容较少时 除了费时费力地手动保存以外 我们也可以通过代码来一次性批量
  • elementui loading自定义图标和字体样式

    需求 页面是用了很多个loading 需要其中有一个字体大些 具体到图标也一样的方法 换下类名就行 遇见的问题 改不好的话会影响其他的loading样式 一起改变了 效果展示 改之前 改之后 关键知识点 element的loading自带的
  • ASP.NET Core路由中间件[1]: 终结点与URL的映射

    一 路由注册 我们演示的这个ASP NET Core应用是一个简易版的天气预报站点 如果用户希望获取某个城市在未来 N 天之内的天气信息 他可以直接利用浏览器发送一个GET请求并将对应城市 采用电话区号表示 和天数设置在URL中 如下图所示