Asp.Net
控制器
访问路径问题
假设在本机访问,端口为 80
, 代码示例,配置了两个接口 Get1
和 Get2
[ApiController]
[Route("[controller]")]
public class TestController : ControllerBase
{
//使用 http://localhost/Test/Get1 访问
[HttpGet("Get1")]
public async Task<int> Get1()
{
//...
}
//使用 http://localhost/Get2 访问
[HttpGet("/Get2")]
public async Task<int> Get2()
{
//...
}
}
- 当 HttpGet 中的路由地址以
/
开头,那么地址不会加上控制器的名称,如:http://localhost/Get2 - 当 HttpGet 中的路由地址不以
/
开头,那么地址会自动加上控制器的名称,如:http://localhost/Test/Get1
全局异常捕获
默认的异常提示
2024-09-18 17:47:51.7860 error:An unhandled exception has occurred while executing the request.
希望的异常提示,最好是有栈跟踪,或者具有明确的错误信息。
通过控制器的过滤器捕获
具有栈跟踪
定义过滤器
public class CustomExceptionFilter : IExceptionFilter
{
private readonly ILogger<CustomExceptionFilter> _logger;
// 注入日志服务
public CustomExceptionFilter(ILogger<CustomExceptionFilter> logger)
{
_logger = logger;
}
public void OnException(ExceptionContext context)
{
var exception = context.Exception;
_logger.LogError("控制器异常:"+exception.ToString());
// 记录异常
context.Result = new RedirectToActionResult("Error", "Home", null);
context.ExceptionHandled = false; // 标记异常未处理,让全局获取
}
}
注册
// 注册全局异常过滤器
builder.Services.AddControllersWithViews(options =>
{
options.Filters.Add<CustomExceptionFilter>(); // 全局添加过滤器
});
捕获控制器的过滤器无法处理的
无栈跟踪,提供错误信息
builder.Services.AddProblemDetails(options =>
options.CustomizeProblemDetails = (context) =>
{
logger.Error($"全局异常捕获:Title: {context.ProblemDetails.Title},Detail: {context.ProblemDetails.Detail}");
}
);
部署 IIS
说明:使用IIS部署,通常是
http
协议,后面要通过 Nginx 来代理访问,因为 Nginx 配置证书等比较方便
以 Windows Server 为例:
先决条件
- NET Core SDK 安装在开发计算机上。如果发布的程序勾选了独立运行,可以不安装SDK。
- 安装IIS,自行网上查找资料。
- 在 IIS 服务器上安装 .NET Core 托管捆绑包。 捆绑包可安装 .NET Core 运行时、.NET Core 库和 ASP.NET Core 模块。 该模块允许 ASP.NET Core 应用在 IIS 后面运行。
- 上面安装的托管捆绑包应该包含了 AspNetCoreModuleV2
发布Asp.NET程序
发布到文件夹。
不要发布单文件格式,好像无法运行。
创建站点
创建应用程序池:在IIS管理器中创建一个新的应用程序池,注意:
- 当部署Blazor项目时:设置.NET CLR版本为“No Managed Code”,正常运行
- 当部署 Web API 项目,并且从 Blazor 项目中跨域访问时(注:API项目中已经配置了跨域策略),这里要选择一个版本,否则会因 跨域问题 无法访问。
创建网站:设置网站名称(仅显示作用),选择自己创建的应用程序池,选择程序目录,设置端口,IP地址和主机名不用填,默认就行
使用 Nginx部署
问题汇总
【开发】以一种访问权限不允许的方式做了一个访问套接字的尝试
经验:多改几个端口尝试,且不要用一些特殊的端口
网上说是防火墙、权限或者端口被占用导致的,解决办法
- 以管理员权限运行VS
- 检查端口是否被占用,查询某个端口
netstat -ano | findstr :7000
,或者使用netsh interface ipv4 show excludedportrange protocol=tcp
查询端口是否被占用
特殊情况
防火墙全部关闭、已经使用管理员运行了VS、检查端口 7000 也没被占用,但是未解决问题:
改变端口尝试,并且如7001、7002等也不行,改为7340解决了问题。
【部署】有的浏览器不能访问
环境:
- 阿里云域名
- 阿里云免费云解析
- 阿里云服务器(带固定公网IP)
- 未备案
阿里云售后给出的答复是,网站未备案,详细回复如下:
您好,www.xxx.com看解析到阿里云大陆主机,未在阿里云备案导致备案拦截无法访问
网站托管在中国内地(大陆)的服务器上,您需根据所在省市的管局规则进行备案申请。当您使用阿里云中国内地(大陆)节点服务器时,您可以在PC端或移动端的阿里云ICP代备案系统中提交ICP备案申请,审核通过便可开通网站访问服务。 https://help.aliyun.com/document_detail/61819.html
备案后:
网站正常访问。
【部署】重启IIS服务可能存在访问异常
错误信息: Microsoft.AspNetCore.Antiforgery.DefaultAntiforgery|An exception was thrown while deserializing the token. Microsoft.AspNetCore.Antiforgery.AntiforgeryValidationException: The antiforgery token could not be decrypted.
当IIS重启过程中,客户端通过刷新浏览器发起请求,由于两次请求的服务不一样,导致出现此错误信息,应该不影响。