当前位置:首页 > 行业动态 > 正文

个人网站c#代码

个人网站开发可选用ASP.NET Core框架,通过Razor页面实现动态渲染,结合EF Core进行数据持久化,利用LINQ优化查询逻辑,最终部署至IIS或云服务平台。(

个人网站开发技术栈选择

在C#生态中构建个人网站通常采用ASP.NET Core框架,该框架具有跨平台、高性能、模块化等特点,以下是核心技术组件:

技术组件 作用 推荐版本
ASP.NET Core Web框架核心 .NET 8+
Entity Framework ORM对象关系映射 0+
SQLite/MySQL 数据库存储 根据需求选择
Blazor/Razor 前端页面渲染引擎 最新版本
xUnit/Junit 单元测试框架 最新稳定版

项目结构设计

建议采用分层架构设计,典型目录结构如下:

/src
  /WebApp
    /Controllers      # 请求处理层
    /Views            # 页面模板
    /Models           # 实体类定义
  /DataAccess         # 数据访问层
    /Repositories     # 仓储接口实现
  /Services           # 业务逻辑层
    /Interfaces       # 服务接口定义
    /Implementations  # 服务实现类
  /Migrations        # 数据库迁移脚本

核心功能实现示例

用户认证系统

// Startup.cs 配置身份验证服务
services.AddIdentity<ApplicationUser, IdentityRole>(options => {
    options.Password.RequiredLength = 8;
    options.User.RequireUniqueEmail = true;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
// AccountController.cs 注册方法
[HttpPost]
public async Task<IActionResult> Register(RegisterViewModel model) {
    if (ModelState.IsValid) {
        var user = new ApplicationUser {
            UserName = model.Username,
            Email = model.Email,
            Nickname = model.Nickname
        };
        var result = await userManager.CreateAsync(user, model.Password);
        if (result.Succeeded) {
            return RedirectToAction("Login");
        }
        AddErrors(result);
    }
    return View(model);
}

文章管理系统

// ArticleService.cs 业务逻辑层
public class ArticleService {
    private readonly IArticleRepository _repository;
    public ArticleService(IArticleRepository repository) {
        _repository = repository;
    }
    public async Task<List<Article>> GetRecentArticlesAsync(int count) {
        return await _repository.GetAllAsync().OrderByDescending(a => a.PublishTime).Take(count).ToListAsync();
    }
}
// ArticleController.cs 控制器
[HttpPost]
public async Task<IActionResult> CreateArticle(ArticleCreateModel model) {
    if (ModelState.IsValid) {
        var article = new Article {
            Title = model.Title,
            Content = model.Content,
            CategoryId = model.CategoryId,
            PublishTime = DateTime.Now,
            AuthorId = User.GetCurrentUserId()
        };
        await _articleService.CreateAsync(article);
        return RedirectToAction("Index");
    }
    return View(model);
}

数据库设计方案

典型个人网站数据库表结构设计:

表名 字段名 数据类型 说明
Users Id int 主键自增
UserName varchar(50) 唯一用户名
PasswordHash varchar(256) 加密密码存储
Email varchar(100) 邮箱验证
CreateTime datetime 账户创建时间
Articles Id int 主键自增
Title varchar(200)
Content text
AuthorId int 外键关联Users表
CategoryId int 外键关联Categories表
ViewCount int 浏览次数
Comments Id int 主键自增
ArticleId int 外键关联Articles表
UserId int 评论者ID
Content text
ParentCommentId int? 父评论ID(实现嵌套)
Categories Id int 主键自增
Name varchar(50) 分类名称
Slug varchar(50) URL友好标识

关键代码实现细节

路由配置

// Program.cs 配置路由规则
app.UseRouting(routes => {
    routes.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}",
        defaults: new { controller = "Home", action = "Index" }
    );
    // API路由配置
    routes.MapControllerRoute(
        name: "api",
        pattern: "api/{controller}/{action}/{id?}",
        defaults: new { action = "Get" }
    );
});

异常处理中间件

// GlobalExceptionMiddleware.cs
public class GlobalExceptionMiddleware {
    private readonly RequestDelegate _next;
    private readonly ILogger<GlobalExceptionMiddleware> _logger;
    public GlobalExceptionMiddleware(RequestDelegate next, ILogger<GlobalExceptionMiddleware> logger) {
        _next = next;
        _logger = logger;
    }
    public async Task InvokeAsync(HttpContext context) {
        try {
            await _next(context);
        } catch (Exception ex) {
            _logger.LogError(ex, "Unhandled exception");
            context.Response.Clear();
            context.Response.StatusCode = StatusCodes.Status500InternalServerError;
            await context.Response.WriteAsJsonAsync(new { message = "服务器内部错误" });
        }
    }
}

静态资源优化

// wwwroot/css/site.css 压缩样式表
body {
    font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
    margin: 0;
    padding: 0;
    background-color: #f8f9fa;
}
// Startup.cs 配置静态文件缓存
app.UseStaticFiles(new StaticFileOptions {
    OnPrepareResponse = context => {
        var cachePeriod = "max-age=31536000"; // 1年缓存
        context.Context.Response.Headers["Cache-Control"] = cachePeriod;
    }
});

部署与运维要点

  1. 环境配置:建议使用Docker容器化部署,通过docker-compose编排多个服务实例,生产环境需配置Kestrel+反向代理(Nginx/Apache)。

  2. SSL证书:通过Let’s Encrypt获取免费证书,配置HTTPS重定向,在Startup.cs中添加:

    services.AddHsts(options => {
     options.DefaultHost = "yourdomain.com";
     options.IncludeSubDomains = false;
    });
  3. 性能优化:启用输出缓存,配置响应压缩,使用CDN加速静态资源加载,典型配置:

    services.AddResponseCompression(options => {
     options.EnableForHttps = true;
     options.MinimumSize = 1024; // 1KB以上内容才压缩
    });
  4. 监控方案:集成Serilog进行日志记录,配置Prometheus+Grafana进行性能监控,日志分级建议:

  • Verbose:开发调试用
  • Information:正常业务流程记录
  • Warning:潜在问题提示
  • Error:影响功能的异常
  • Critical:系统崩溃级错误

安全防护措施

  1. 防SQL注入:使用EF Core参数化查询,避免字符串拼接,示例:

    // 安全查询方式
    var user = await _context.Users.FirstOrDefaultAsync(u => u.Username == inputUsername);
  2. XSS防护:对用户输入内容进行HTML编码,Blazor组件自动处理,手动处理示例:

    public static string Encode(string input) {
     return System.Web.HttpUtility.HtmlEncode(input).Replace("&quot;", """);
    }
  3. CSRF防护:ASP.NET Core默认启用Anti-CSRF令牌验证,需在表单中包含<input name="__RequestVerificationToken" type="hidden" value="..." />

FAQs常见问题解答

Q1:部署时出现”Could not find a valid OpenSSL installation”错误怎么办?
A1:该错误通常发生在Linux服务器部署时,解决方法:

  1. 安装OpenSSL开发库:sudo apt-get install libssl-dev
  2. 确认.NET运行时版本兼容(建议使用.NET 8+)
  3. 检查Docker镜像是否包含必要SSL组件
  4. 重新生成发布文件:dotnet publish -r linux-x64 --self-contained

Q2:如何实现文章Markdown内容渲染?
A2:解决方案步骤:

  1. 安装Markdig库:dotnet add package Markdig
  2. 在Razor视图中添加:
    @addTagHelper , Microsoft.AspNetCore.Mvc.TagHelpers
    @using Markdig;
    @model string // Markdown内容模型  
    @{  
     var pipeline = new MarkdownPipelineBuilder().UseAdvancedExtensions().Build();  
     var html = Markdown.ToHtml(Model, pipeline);  
    }  
    @Html.Raw(html) // 输出HTML内容 
  3. 配置TinyMCE等富文本编辑器,设置Mark
0