程序做网站好还是app好,重庆给商家企业做网站,网站合同需要注意什么呢,广州有几个区几个县级市文章目录 前言面试题目#xff08;只记录了还记得的部分#xff09;一.简单说下.NETCORE的生命周期#xff1f;二.C#如何保证在并发情况下接口不会被重复触发#xff1f;三.引用类型和值类型有什么区别#xff1f;四.那怎样能让引用类型和值类型一样#xff0c;在赋值的时… 文章目录 前言面试题目只记录了还记得的部分一.简单说下.NETCORE的生命周期二.C#如何保证在并发情况下接口不会被重复触发三.引用类型和值类型有什么区别四.那怎样能让引用类型和值类型一样在赋值的时候创建新的数据在更改新的引用类型对象b的时候不影响原来的引用类型对象a五.C#获取接口响应时间。六.需要所有接口都这样写一次吗可以统一获取接口响应时间吗七.接口的异常捕捉。八..NETCORE注册如何注册并使用Session九.数据库如何实现事务隔离十.聚集索引和非聚集索引。 总结 前言
公司近期工作制度不合理跟管理层反映无果后就有了跳槽的打算于是开始寻找新的机会参加了一家中级.NET开发工程师的面试。
面试题目只记录了还记得的部分
一.简单说下.NETCORE的生命周期
1.文言一心版回答 .NET Core应用程序的生命周期通常从创建应用程序的主入口点开始随后是初始化应用程序配置服务建立请求管道以处理每个HTTP请求。在请求处理完毕后应用程序会关闭。
2.ChatAI3.5版回答 在.NET Core 应用程序中有以下几个主要的生命周期阶段 a.启动阶段Bootstrap在这个阶段应用程序会进行一些初始化操作比如加载配置注册服务设置日志等。 b.运行时阶段Runtime在这个阶段应用程序正式开始执行业务逻辑处理请求等操作。 c.关闭阶段Shutdown在应用程序即将停止运行时会执行一些清理操作释放资源等。 在这些阶段中可以通过事件来监听应用程序的状态变化以便在合适的时机执行相应的操作。比如可以使用以下事件 ApplicationStarted应用程序启动时触发。 ApplicationStopping应用程序即将停止时触发。 ApplicationStopped应用程序已经停止时触发。 通过监听这些事件可以在不同阶段执行相应的代码以实现更精细的控制和管理应用程序的生命周期。
3.博客园某博主的相关回答 .NetCore 依赖注入的三个生命周期理解 AddTransient瞬时模式每次请求都获取一个新的实例。即使同一个请求获取多次也会是不同的实例注意这里的获取多次对象是指通过上下文获取对象而不是共用上一个对象 AddScoped每次请求都获取一个新的实例。同一个请求获取多次会得到相同的实例。 AddSingleton单例模式每次都获取同一个实例。
二.C#如何保证在并发情况下接口不会被重复触发
1.接口在都是同步代码的情况下我会使用lock语句块对代码进行加锁。
2.接口在存在异步代码的情况下我会使用Semaphore或者SemaphoreSlim通过信息量控制接口线程保证接口不会被重复触发。
3.通过redis锁的方式保证单据的唯一性。
4.通过数据库锁的方式使用WITHTABLOCKHOLDLOCK选项来获取表级别的排它锁或者使用WITHUPDLOCKLROWLOCK选项来获取行级别的排它锁从而控制对数据库对象的并发访问。
三.引用类型和值类型有什么区别
1.引用类型 a.变量存储对象的引用内存地址实际数据存储在堆上。 b.引用类型的变量指向实际的对象对变量赋值只复制引用不复制整个对象比如说a对象赋值给b对象当我们对b对象进行更改的时候a对象也会跟着改变因为他们实际上是指向同一个内存地址值从始至终都只有一个 c.常用的引用类型有类Class接口Interface委托Delegate字符串string数组Array等
2.值类型 a.变量直接包含数据存储在栈中 b.值类型赋值会直接复制一个新的数据比如说a赋值给b就会在b那复制一份新的数据对b进行任何操作都不影响a c.常用的值类型有整数类型intlongshortbyte浮点数类型floatdoubledecimal字符类型char布尔类型bool结构体struct枚举enumintDateTime问号表示值可以为null等
四.那怎样能让引用类型和值类型一样在赋值的时候创建新的数据在更改新的引用类型对象b的时候不影响原来的引用类型对象a
ChatAI3.5回答 1.深拷贝Deep Copy对于自定义的引用类型可以在对象内部实现深拷贝逻辑即创建一个新的对象将原始对象的数据赋值到新对象中。这样在对新的对象进行修改时不会影响初始对象。
2.使用特定的复制方法对于一些标准的引用类型比如说字符串和数组就可以使用string.Copy()和Array.Copy()方法来创建新的对象。
个人补充 1.C#在方法调用参数的时候参数类型前面可以加ref或者in关键字 其中ref关键字会让任何传递过来的参数当作引用类型处理即在方法中变更参数传入方法中的值参数也会被当作引用类型处理同步发生改变 而in关键会将传递过来的参数视为只读这样就避免了在方法内部对参数进行修改。
2.C#可以通过序列化反序列化生成一个新的引用类型不影响初始引用对象。
五.C#获取接口响应时间。
ChatAI3.5回答 1.使用Stopwatch对象使用stopwatch.Start()方法和stopwatch.Stop()方法分别置于接口请求前后而后通过stopwatch.Elapsed属性获取接口响应时间。
2.接口请求前后分别使用DateTimeOffset.UtcNow.ToUnixTimeSeconds()获取当前服务器的时间戳值通过两个时间戳的差值得到接口响应时间。
六.需要所有接口都这样写一次吗可以统一获取接口响应时间吗
ChatAI3.5回答 1.在C#中可以通过创建一个统一的HTTP客户端类来封装发送HTTP请求的逻辑并在其中实现统一计算接口请求消耗时间的功能。这样可以避免每个接口单独计算请求消耗时间的重复操作。 代码案例如下
using System;
using System.Diagnostics;
using System.Net.Http;
using System.Threading.Tasks;public class CustomHttpClient
{private HttpClient _httpClient;public CustomHttpClient(){_httpClient new HttpClient();}public async Taskstring GetResponseTimeAsync(string url){var stopwatch new Stopwatch();stopwatch.Start()HttpResponseMessage response await _httpClient.GetAsync(url);stopwatch.Stop();TimeSpan elapsed stopwatch.Elapsed;return $接口响应时间为{elapsed.TotalMilliseconds}ms;}
}七.接口的异常捕捉。
ChatAI3.5回答 在C#中你可以通过自定义Action Filter来实现用户请求接口异常时记录异常信息请求参数等功能。Action Filter是ASP.NET Core中一种常用的过滤器可以用来在执行控制器中的Action前后执行一些逻辑列入日志记录异常处理等操作。
下面是一种简单的示例演示了如何在ASP.NET Core 中实现一个自定义Action Filter来记录异常信息和请求参数
首先定义一个自定的Action Filter类继承IActionFilter接口
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Logging;public class CustomActionFilter : IActionFilter{private readonly ILoggerCustomActionFilter _logger;public CustomActionFilter(ILoggerCustomActionFilter logger){_logger logger;}public void OnActionExecting(ActionExecutingContext context){//在执行Action前记录请求参数var parameters context.ActionArguments;_logger.LogInformation(Request Parameters:{parmeters},parameters);}public void OnActionExecuted(ActionExecutedContext context){//在执行Action后记录异常信息if(context.Exception ! null){_logger.logError(context.Exception,An error occurred while processing the request.);}}
}然后在Starup.cs中注册该Aciton Filter
using Microsoft.Extensions.DependencyInjection;public class Startup{public void ConfigureServices(IServericeCollection services){services.AddControllers(options {option.Filters.AddCustomActionFilter();});//添加其他服务配置}
}在上述案例中我们定义了一个 CustomActionFilter类来实现自定一个的Action Filter功能其中在OnActionExecuting方法中记录请求参数在OnActionExecuted方法中记录异常信息。然后在Startup.cs中通过options.Filters.Add()注册该Action Filter。
通过这种方式当用户请求接口发生异常Action Filter会自动捕捉并记录异常信息请求参数等方便后续排查问题和分析。
八…NETCORE注册如何注册并使用Session
ChatAI3.5回答 在Asp.NET Core中你可以通过AddSession方法来注册并配置Session功能。下面是一个简单的示例。
首先在Startup.cs的ConfigureServices方法中进行注册和配置
public class Startup{public void ConfigureServices(IServiceCollection services){//其他服务配置services.AddSession(options{options.IdleTImeout TimeSpan.FromMinutes(20);options.Cookie.HttpOnly true;options.Cooie.IsEssential true;});//其他服务配置}public void Configure(IApplicationBuilder app,IWebHostEnvironment env){//其他中间件配置app.UseSession();//其他中间件配置}
}在上述案例中我们功过services.AddSession()方法注册了Session功能并且配置了Session的超时时间Cookie特性等。然后在Configure方法中使用app.UseSession()启用了Session中间件。 接下来可以在控制器或者Razor页面中使用HttpContext.Session属性来访问和操作Session数据例如
public class HomeController:Controller{public IActionResult Index(){HttpContext.Session.SetString(UserName,Joker);var userName HttpContext.Session.GetString(UserName);return View();}
}上述案例中通过HttpContext.Session.SetString()方法存储Session值HttpContext.Session.GetString()方法获取对应的Session值
九.数据库如何实现事务隔离
数据库可以通过加锁来实现事务隔离常见的锁有行级锁表级锁页级锁等。这些锁可以用于实现不同的事务隔离级别例如可重复读和串行化级别。比如
1.行级锁行级锁是对数据库中的行进行加锁当一个事务要访问某一行数据时会获取该行的锁其他事务无法修改该行知道锁被释放。行及锁可以实现较高的并发性和灵活性sqlserver常见的行级锁有共享锁Shared Lock排他锁Exclusive Lock
2.表级锁表级锁时对整个表进行加锁当一个事务要访问表中的数据时会获取整个表的锁其他事务无法修改表中的数据知道锁被释放。表级锁通常用于较低级别的隔离要求因为它限制了其他事务对表的访问sqlserver常见的表级锁有表共享锁table shared lock表排它锁table exclusive lock
3.页级锁页级锁时对数据库中的页通常是连续的数据块进行加锁当一个事务需要访问某一页数据时会获取该页的锁其他事务无法修改该页中的数据知道锁被释放。页级锁介于行级锁和表级锁之间可以在一定程度上平衡并发性能和隔离级别要求sqlserver常见的页级锁有页共享锁page shared lock页排它锁page exclusive lock
4.sqlserver还提供了其他类型的锁比如 意向锁intent lock更新锁update lock行版本锁row versioning locks等用于支持不同的并发控制需求
十.聚集索引和非聚集索引。
sqlserver中的聚集索引和非聚集索引是数据库中常用的两种索引类型他们在数据库查询性能优化和数据存储方面起到重要作用。 1.聚集索引Clustered Index a. 定义聚集索引确定了表中数据的物理排序顺序并且叶子节点包含实际的数据行。 b.特点每张表只有一个聚集索引它决定了表中数据的物理存储顺序因此表中的数据按照聚集索引的顺序进行存储。 c.优势通过聚集索引可以快速查询范围内的数据因为数据行在物理上相邻适合范围查询和排序。 d.适用场景适用于经常按照某列进行范围查找和排序的字段。
2.非聚集索引Non-Clustered Index a.定义非聚集索引中叶子节点并不包含实际的数据行而是包含指向实际数据行的指针。 b.特点一张表可以拥有多个非聚集索引他们并不影响表中数据的物理存储顺序而是在索引中维护指向实际数据行的引用。 c.优势通过非聚集索引可以快速定位到需要的记录适合于单值查询和覆盖索引。 d.适用场景适合于经常要进行单值查询的字段例如where子句中的条件字段。
总结
总的来说这是一场很失败的面试经历吃一堑长一智再接再厉。