网站首页 网站源码
using System.Xml.Serialization;
using Dpz.Core.Service.ObjectStorage.Services;
using Dpz.Core.Service.V4.Services;
using Dpz.Core.Web.Library.Hub;
using Hangfire;
using Microsoft.AspNetCore.Routing;
using Microsoft.AspNetCore.SignalR;
using IMumbleService = Dpz.Core.Service.V4.Services.IMumbleService;
/*
* 生成站点地图
* siteMapPushMessage 参数说明
* 0:推送消息
* 1:推送时间
* 2:推送消息样式
*
*/
namespace Dpz.Core.Web.Library.Activator;
public class SiteMapTaskActivator(
LinkGenerator linkGenerator,
IHubContext<Notification> hubContext,
ILogger<SiteMapTaskActivator> logger,
IArticleService service,
IMumbleService mumbleService,
IObjectStorageOperation objectStorageService,
IConfiguration configuration
) : JobActivator
{
/// <summary>
/// 链接生成器
/// </summary>
private readonly LinkGenerator _linkGenerator = linkGenerator;
/// <summary>
/// SignalR hub
/// </summary>
private readonly IHubContext<Notification> _hubContext = hubContext;
/// <summary>
/// 日志记录
/// </summary>
private readonly ILogger<SiteMapTaskActivator> _logger = logger;
/// <summary>
/// 互斥信号
/// </summary>
private static readonly SemaphoreSlim SemaphoreSlim = new(1, 1);
/// <summary>
/// sitemap data
/// </summary>
private readonly DataSource _sitemap = new() { Source = [] };
[ProlongExpirationTime]
public async Task StartAsync()
{
if (!string.Equals(configuration["AgileConfig:env"], "PROD"))
{
_logger.LogInformation("非生产环境,跳过站点地图生成!");
return;
}
await SemaphoreSlim.WaitAsync();
try
{
await _hubContext.Clients.All.SendCoreAsync(
"siteMapPushMessage",
["任务已开始!", DateTime.Now, "color:rgb(123, 213, 98)"]
);
await GenerateArticleLink();
await GenerateTalkLink();
// 源码
_sitemap.Source.Add(
new SiteData
{
Url = _linkGenerator.GetPathByAction("Index", "Code", new { path = "" }),
Frequency = "weekly",
Priority = 0.5f,
UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
}
);
// 音乐
_sitemap.Source.Insert(
0,
new SiteData
{
Url = _linkGenerator.GetPathByAction("Index", "Music"),
Frequency = "weekly",
Priority = 0.5f,
UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
}
);
// 时间轴
_sitemap.Source.Insert(
0,
new SiteData
{
Url = _linkGenerator.GetPathByAction("Timeline", "Home"),
Frequency = "weekly",
Priority = 0.5f,
UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
}
);
// steam
_sitemap.Source.Insert(
0,
new SiteData
{
Url = _linkGenerator.GetPathByAction("Index", "Steam"),
Frequency = "weekly",
Priority = 0.5f,
UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
}
);
// 首页
_sitemap.Source.Insert(
0,
new SiteData
{
Url = _linkGenerator.GetPathByAction("Index", "Home"),
Frequency = "weekly",
Priority = 0.5f,
UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
}
);
// 友链
_sitemap.Source.Add(
new SiteData
{
Url = _linkGenerator.GetPathByAction("Friends", "Home"),
Frequency = "weekly",
Priority = 0.5f,
UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
}
);
// 书签
_sitemap.Source.Add(
new SiteData
{
Url = _linkGenerator.GetPathByAction("Index", "Bookmark"),
Frequency = "weekly",
Priority = 0.5f,
UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
}
);
// markdown guide
_sitemap.Source.Add(
new SiteData
{
Url = _linkGenerator.GetPathByAction("Markdown", "Home"),
Frequency = "weekly",
Priority = 0.5f,
UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
}
);
_sitemap.Source.Add(
new SiteData
{
Url = _linkGenerator.GetPathByAction("GetAlbums", "Home"),
Frequency = "weekly",
Priority = 0.5f,
UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
}
);
_sitemap.Source.ForEach(x => x.Url = "https://core.dpangzi.com" + x.Url);
var serializer = new XmlSerializer(typeof(DataSource));
using var stream = new MemoryStream();
serializer.Serialize(stream, _sitemap);
var bytes = stream.ToArray();
var uploadPath =
#if DEBUG
new[] { "Test", "sitemap" };
#else
new[] { "sitemap" };
#endif
await objectStorageService.UploadAsync(bytes, uploadPath, "sitemap.xml");
_logger.LogInformation("站点地图生成成功!");
await _hubContext.Clients.All.SendCoreAsync(
"siteMapPushMessage",
["站点地图生成成功!", DateTime.Now, "color:rgb(123, 213, 98)"]
);
}
catch (Exception ex)
{
_logger.LogError(ex, "sitemap生成失败");
await _hubContext.Clients.All.SendCoreAsync(
"siteMapPushMessage",
["sitemap生成失败", DateTime.Now, "color:red;font-weight:bold"]
);
throw;
}
finally
{
SemaphoreSlim.Release();
}
}
/// <summary>
/// 生成文章相关链接
/// </summary>
/// <returns></returns>
private async Task GenerateArticleLink()
{
var articlePages = Enumerable
.Range(1, 200)
.Select(x => new SiteData
{
Url = _linkGenerator.GetPathByAction("Index", "Article", new { pageIndex = x }),
Frequency = "weekly",
Priority = 0.5f,
UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
})
.ToList();
_sitemap.Source.AddRange(articlePages);
var tags = await service.GetAllTagsAsync();
_sitemap.Source.AddRange(
tags.Select(x => new SiteData
{
Url = _linkGenerator.GetPathByAction("Index", "Article", new { tag = x }),
Frequency = "weekly",
Priority = 0.5f,
UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
})
);
var publishArticles = await service.GetPublishArticlesAsync();
_sitemap.Source.AddRange(
publishArticles.Select(x => new SiteData
{
Url = _linkGenerator.GetPathByAction("Read", "Article", new { id = x.Id }),
Frequency = "weekly",
Priority = 0.5f,
UpdateTime = x.CreateTime.ToString("yyyy-MM-dd"),
})
);
}
/// <summary>
/// 生成talk相关链接
/// </summary>
/// <returns></returns>
private async Task GenerateTalkLink()
{
await _hubContext.Clients.All.SendCoreAsync(
"siteMapPushMessage",
["正在查询talk相关数据", DateTime.Now, "color:rgba(247,140,108,1)"]
);
var pager = await mumbleService.GetPagesAsync(1, 10);
await _hubContext.Clients.All.SendCoreAsync(
"siteMapPushMessage",
[
"正在生成 talk 分页相关链接",
DateTime.Now,
"color:rgba(247,140,108,1)"
]
);
var talkPage = Enumerable
.Range(1, pager.TotalPageCount)
.Select(x => new SiteData
{
Url = _linkGenerator.GetPathByAction("Index", "Talk", new { pageIndex = x }),
Frequency = "weekly",
Priority = 0.5f,
UpdateTime = DateTime.Now.ToString("yyyy-MM-dd"),
});
_sitemap.Source.AddRange(talkPage);
}
}
这段代码是一个 ASP.NET Core 应用程序中的类 SiteMapTaskActivator
,它的主要功能是生成网站地图(sitemap),并将其上传到对象存储服务。以下是代码的详细解释:
SiteMapTaskActivator
类的构造函数接受多个依赖项,包括:
LinkGenerator
:用于生成 URL。IHubContext<Notification>
:用于与 SignalR 客户端进行通信,发送实时消息。ILogger<SiteMapTaskActivator>
:用于记录日志。IArticleService
:用于获取文章和标签数据。IWebHostEnvironment
:提供有关 web 应用程序托管环境的信息。IMumbleService
:用于获取与“talk”相关的数据。IObjectStorageOperation
:用于与对象存储服务交互。使用 SemaphoreSlim
来确保在同一时间只有一个任务实例在执行,以避免并发问题。
_sitemap
是一个 DataSource
对象,包含一个 Source
列表,用于存储网站地图中的所有链接。
StartAsync
方法这是类的主要方法,负责生成网站地图的逻辑:
GenerateArticleLink
和 GenerateTalkLink
方法来生成文章和“talk”相关的链接。_sitemap.Source
列表中。https://core.dpangzi.com
。XmlSerializer
将 _sitemap
序列化为 XML 格式,并将其上传到对象存储服务。GenerateArticleLink
方法:
GenerateTalkLink
方法:
在 StartAsync
方法中,使用 try-catch 块来捕获可能发生的异常,并记录错误信息,同时向客户端发送失败消息。
整体而言,这段代码的功能是定期生成网站的 sitemap,包含文章、标签、talk 等相关链接,并将其上传到对象存储服务,以便搜索引擎能够更好地索引网站内容。通过 SignalR 实时通知用户任务的进度和结果。