Browse Source

Merge branch 'dev' into fix-multiple-to-mails

pull/1281/head
yx lin 1 year ago
committed by GitHub
parent
commit
62d5d60864
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 3
      aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/FodyWeavers.xml
  2. 20
      aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN.Abp.AspNetCore.Auditing.csproj
  3. 19
      aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingHeaderOptions.cs
  4. 17
      aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingModule.cs
  5. 51
      aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AspNetCoreRecordHeaderAuditLogContributor.cs
  6. 19
      aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/README.md
  7. 6
      aspnet-core/modules/account/LINGYUN.Abp.Account.Application/LINGYUN/Abp/Account/MyProfileAppService.cs
  8. 2
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Domain/LINGYUN/Abp/Identity/AbpIdentityDomainModule.cs
  9. 71
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Domain/LINGYUN/Abp/Identity/Session/IdentitySessionCacheItemSynchronizer.cs
  10. 28
      aspnet-core/modules/identity/LINGYUN.Abp.Identity.Domain/LINGYUN/Abp/Identity/Session/IdentitySessionCleanupBackgroundWorker.cs
  11. 19
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IFileAppService.cs
  12. 14
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IPrivateFileAppService.cs
  13. 18
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IPublicFileAppService.cs
  14. 2
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileAppServiceBase.cs
  15. 4
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi.Client/ClientProxies/LINGYUN/Abp/OssManagement/PrivateFilesClientProxy.Generated.cs
  16. 4
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi.Client/ClientProxies/LINGYUN/Abp/OssManagement/PublicFilesClientProxy.Generated.cs
  17. 182
      aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi.Client/ClientProxies/oss-management-generate-proxy.json
  18. 6
      aspnet-core/modules/platform/LINGYUN.Platform.Domain/LINGYUN/Platform/Messages/EmailMessageManager.cs
  19. 2
      aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Templating/LINGYUN.Abp.Notifications.Templating.csproj

3
aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/FodyWeavers.xml

@ -0,0 +1,3 @@
<Weavers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="FodyWeavers.xsd">
<ConfigureAwait ContinueOnCapturedContext="false" />
</Weavers>

20
aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN.Abp.AspNetCore.Auditing.csproj

@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\..\configureawait.props" />
<Import Project="..\..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<AssemblyName>LINGYUN.Abp.AspNetCore.Auditing</AssemblyName>
<PackageId>LINGYUN.Abp.AspNetCore.Auditing</PackageId>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Volo.Abp.AspNetCore" />
</ItemGroup>
</Project>

19
aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingHeaderOptions.cs

@ -0,0 +1,19 @@
using System.Collections.Generic;
namespace LINGYUN.Abp.AspNetCore.Auditing;
public class AbpAspNetCoreAuditingHeaderOptions
{
/// <summary>
/// 是否在审计日志中记录Http请求头,默认: true
/// </summary>
public bool IsEnabled { get; set; }
/// <summary>
/// 要记录的Http请求头
/// </summary>
public IList<string> HttpHeaders { get; }
public AbpAspNetCoreAuditingHeaderOptions()
{
IsEnabled = true;
HttpHeaders = new List<string>();
}
}

17
aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AbpAspNetCoreAuditingModule.cs

@ -0,0 +1,17 @@
using Volo.Abp.AspNetCore;
using Volo.Abp.Auditing;
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.AspNetCore.Auditing;
[DependsOn(typeof(AbpAspNetCoreModule))]
public class AbpAspNetCoreAuditingModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpAuditingOptions>(options =>
{
options.Contributors.Add(new AspNetCoreRecordHeaderAuditLogContributor());
});
}
}

51
aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/LINGYUN/Abp/AspNetCore/Auditing/AspNetCoreRecordHeaderAuditLogContributor.cs

@ -0,0 +1,51 @@
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using System.Collections.Generic;
using System.Collections.Immutable;
using Volo.Abp.Auditing;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.AspNetCore.Auditing;
public class AspNetCoreRecordHeaderAuditLogContributor : AuditLogContributor, ITransientDependency
{
private const string HttpHeaderRecordKey = "HttpHeaders";
public AspNetCoreRecordHeaderAuditLogContributor()
{
}
public override void PreContribute(AuditLogContributionContext context)
{
var options = context.ServiceProvider.GetRequiredService<IOptions<AbpAspNetCoreAuditingHeaderOptions>>();
if (!options.Value.IsEnabled)
{
return;
}
var httpContext = context.ServiceProvider.GetRequiredService<IHttpContextAccessor>().HttpContext;
if (httpContext == null)
{
return;
}
if (context.AuditInfo.HasProperty(HttpHeaderRecordKey))
{
return;
}
var headerRcords = new Dictionary<string, string>();
var httpHeaders = httpContext.Request.Headers.ToImmutableDictionary();
foreach (var headerKey in options.Value.HttpHeaders)
{
if (httpHeaders.TryGetValue(headerKey, out var headers))
{
headerRcords[headerKey] = headers.JoinAsString(";");
}
}
context.AuditInfo.SetProperty(HttpHeaderRecordKey, headerRcords);
}
}

19
aspnet-core/framework/auditing/LINGYUN.Abp.AspNetCore.Auditing/README.md

@ -0,0 +1,19 @@
# LINGYUN.Abp.AspNetCore.Auditing
审计日期扩展模块, 用于在审计日志中加入特定的Http请求头记录
## 模块引用
```csharp
[DependsOn(typeof(AbpAspNetCoreAuditingModule))]
public class YouProjectModule : AbpModule
{
// other
}
```
## 配置项
* AbpAspNetCoreAuditingHeaderOptions.IsEnabled 是否在审计日志中记录Http请求头,默认: true
* AbpAspNetCoreAuditingHeaderOptions.HttpHeaders 需要在审计日志中记录的Http请求头列表

6
aspnet-core/modules/account/LINGYUN.Abp.Account.Application/LINGYUN/Abp/Account/MyProfileAppService.cs

@ -75,12 +75,12 @@ public class MyProfileAppService : AccountApplicationServiceBase, IMyProfileAppS
public async virtual Task<PagedResultDto<IdentitySessionDto>> GetSessionsAsync(GetMySessionsInput input) public async virtual Task<PagedResultDto<IdentitySessionDto>> GetSessionsAsync(GetMySessionsInput input)
{ {
var user = await GetCurrentUserAsync(); var userId = CurrentUser.GetId();
var totalCount = await IdentitySessionRepository.GetCountAsync( var totalCount = await IdentitySessionRepository.GetCountAsync(
user.Id, input.Device, input.ClientId); userId, input.Device, input.ClientId);
var identitySessions = await IdentitySessionRepository.GetListAsync( var identitySessions = await IdentitySessionRepository.GetListAsync(
input.Sorting, input.MaxResultCount, input.SkipCount, input.Sorting, input.MaxResultCount, input.SkipCount,
user.Id, input.Device, input.ClientId); userId, input.Device, input.ClientId);
return new PagedResultDto<IdentitySessionDto>(totalCount, return new PagedResultDto<IdentitySessionDto>(totalCount,
identitySessions.Select(session => new IdentitySessionDto identitySessions.Select(session => new IdentitySessionDto

2
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Domain/LINGYUN/Abp/Identity/AbpIdentityDomainModule.cs

@ -5,6 +5,7 @@ using System.Threading.Tasks;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.AutoMapper; using Volo.Abp.AutoMapper;
using Volo.Abp.BackgroundWorkers; using Volo.Abp.BackgroundWorkers;
using Volo.Abp.DistributedLocking;
using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.Domain.Entities.Events.Distributed;
using Volo.Abp.Identity; using Volo.Abp.Identity;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
@ -14,6 +15,7 @@ namespace LINGYUN.Abp.Identity;
[DependsOn( [DependsOn(
typeof(AbpIdentityDomainSharedModule), typeof(AbpIdentityDomainSharedModule),
typeof(AbpDistributedLockingAbstractionsModule),
typeof(Volo.Abp.Identity.AbpIdentityDomainModule))] typeof(Volo.Abp.Identity.AbpIdentityDomainModule))]
public class AbpIdentityDomainModule : AbpModule public class AbpIdentityDomainModule : AbpModule
{ {

71
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Domain/LINGYUN/Abp/Identity/Session/IdentitySessionCacheItemSynchronizer.cs

@ -4,6 +4,7 @@ using Microsoft.Extensions.Logging.Abstractions;
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.DistributedLocking;
using Volo.Abp.Domain.Entities.Events; using Volo.Abp.Domain.Entities.Events;
using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.Domain.Entities.Events.Distributed;
using Volo.Abp.EventBus; using Volo.Abp.EventBus;
@ -22,15 +23,18 @@ public class IdentitySessionCacheItemSynchronizer :
{ {
public ILogger<IdentitySessionCacheItemSynchronizer> Logger { protected get; set; } public ILogger<IdentitySessionCacheItemSynchronizer> Logger { protected get; set; }
protected ISettingProvider SettingProvider { get; } protected ISettingProvider SettingProvider { get; }
protected IAbpDistributedLock DistributedLock { get; }
protected IIdentitySessionCache IdentitySessionCache { get; } protected IIdentitySessionCache IdentitySessionCache { get; }
protected IIdentitySessionStore IdentitySessionStore { get; } protected IIdentitySessionStore IdentitySessionStore { get; }
public IdentitySessionCacheItemSynchronizer( public IdentitySessionCacheItemSynchronizer(
ISettingProvider settingProvider, ISettingProvider settingProvider,
IAbpDistributedLock distributedLock,
IIdentitySessionCache identitySessionCache, IIdentitySessionCache identitySessionCache,
IIdentitySessionStore identitySessionStore) IIdentitySessionStore identitySessionStore)
{ {
SettingProvider = settingProvider; SettingProvider = settingProvider;
DistributedLock = distributedLock;
IdentitySessionCache = identitySessionCache; IdentitySessionCache = identitySessionCache;
IdentitySessionStore = identitySessionStore; IdentitySessionStore = identitySessionStore;
@ -45,34 +49,71 @@ public class IdentitySessionCacheItemSynchronizer :
[UnitOfWork] [UnitOfWork]
public async virtual Task HandleEventAsync(EntityCreatedEto<IdentitySessionEto> eventData) public async virtual Task HandleEventAsync(EntityCreatedEto<IdentitySessionEto> eventData)
{ {
await RefreshSessionCache(eventData.Entity); var lockKey = $"{nameof(IdentitySessionCacheItemSynchronizer)}_{nameof(EntityCreatedEto<IdentitySessionEto>)}";
await CheckConcurrentLoginStrategy(eventData.Entity); await using (var handle = await DistributedLock.TryAcquireAsync(lockKey))
{
Logger.LogInformation($"Lock is acquired for {lockKey}");
if (handle == null)
{
Logger.LogInformation($"Handle is null because of the locking for : {lockKey}");
return;
}
await RefreshSessionCache(eventData.Entity);
await CheckConcurrentLoginStrategy(eventData.Entity);
}
} }
[UnitOfWork]
public async virtual Task HandleEventAsync(IdentitySessionChangeAccessedEvent eventData) public async virtual Task HandleEventAsync(IdentitySessionChangeAccessedEvent eventData)
{ {
var idetitySession = await IdentitySessionStore.FindAsync(eventData.SessionId); var lockKey = $"{nameof(IdentitySessionCacheItemSynchronizer)}_{nameof(IdentitySessionChangeAccessedEvent)}";
if (idetitySession != null) await using (var handle = await DistributedLock.TryAcquireAsync(lockKey))
{ {
if (!eventData.IpAddresses.IsNullOrWhiteSpace()) Logger.LogInformation($"Lock is acquired for {lockKey}");
if (handle == null)
{ {
idetitySession.SetIpAddresses(eventData.IpAddresses.Split(",")); Logger.LogInformation($"Handle is null because of the locking for : {lockKey}");
return;
} }
idetitySession.UpdateLastAccessedTime(eventData.LastAccessed);
await IdentitySessionStore.UpdateAsync(idetitySession); var idetitySession = await IdentitySessionStore.FindAsync(eventData.SessionId);
} if (idetitySession != null)
else {
{ if (!eventData.IpAddresses.IsNullOrWhiteSpace())
// 数据库中不存在会话, 清理缓存, 后续请求会话失效 {
await IdentitySessionCache.RemoveAsync(eventData.SessionId); idetitySession.SetIpAddresses(eventData.IpAddresses.Split(","));
}
idetitySession.UpdateLastAccessedTime(eventData.LastAccessed);
await IdentitySessionStore.UpdateAsync(idetitySession);
}
else
{
// 数据库中不存在会话, 清理缓存, 后续请求会话失效
await IdentitySessionCache.RemoveAsync(eventData.SessionId);
}
} }
} }
public async virtual Task HandleEventAsync(EntityDeletedEventData<IdentityUser> eventData) public async virtual Task HandleEventAsync(EntityDeletedEventData<IdentityUser> eventData)
{ {
// 用户被删除, 移除所有会话 var lockKey = $"{nameof(IdentitySessionCacheItemSynchronizer)}_{nameof(EntityDeletedEventData<IdentityUser>)}";
await IdentitySessionStore.RevokeAllAsync(eventData.Entity.Id); await using (var handle = await DistributedLock.TryAcquireAsync(lockKey))
{
Logger.LogInformation($"Lock is acquired for {lockKey}");
if (handle == null)
{
Logger.LogInformation($"Handle is null because of the locking for : {lockKey}");
return;
}
// 用户被删除, 移除所有会话
await IdentitySessionStore.RevokeAllAsync(eventData.Entity.Id);
}
} }
protected async virtual Task RefreshSessionCache(IdentitySessionEto session) protected async virtual Task RefreshSessionCache(IdentitySessionEto session)

28
aspnet-core/modules/identity/LINGYUN.Abp.Identity.Domain/LINGYUN/Abp/Identity/Session/IdentitySessionCleanupBackgroundWorker.cs

@ -1,20 +1,25 @@
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.BackgroundWorkers; using Volo.Abp.BackgroundWorkers;
using Volo.Abp.DistributedLocking;
using Volo.Abp.Threading; using Volo.Abp.Threading;
namespace LINGYUN.Abp.Identity.Session; namespace LINGYUN.Abp.Identity.Session;
public class IdentitySessionCleanupBackgroundWorker : AsyncPeriodicBackgroundWorkerBase public class IdentitySessionCleanupBackgroundWorker : AsyncPeriodicBackgroundWorkerBase
{ {
protected IAbpDistributedLock DistributedLock { get; }
protected IdentitySessionCleanupOptions Options { get; } protected IdentitySessionCleanupOptions Options { get; }
public IdentitySessionCleanupBackgroundWorker( public IdentitySessionCleanupBackgroundWorker(
AbpAsyncTimer timer, AbpAsyncTimer timer,
IServiceScopeFactory serviceScopeFactory, IServiceScopeFactory serviceScopeFactory,
IOptions<IdentitySessionCleanupOptions> options) IOptions<IdentitySessionCleanupOptions> options,
IAbpDistributedLock distributedLock)
: base(timer, serviceScopeFactory) : base(timer, serviceScopeFactory)
{ {
DistributedLock = distributedLock;
Options = options.Value; Options = options.Value;
timer.Period = Options.CleanupPeriod; timer.Period = Options.CleanupPeriod;
} }
@ -26,9 +31,22 @@ public class IdentitySessionCleanupBackgroundWorker : AsyncPeriodicBackgroundWor
return; return;
} }
await workerContext await using (var handle = await DistributedLock.TryAcquireAsync(nameof(IdentitySessionCleanupBackgroundWorker)))
.ServiceProvider {
.GetRequiredService<IdentitySessionCleanupService>() Logger.LogInformation($"Lock is acquired for {nameof(IdentitySessionCleanupBackgroundWorker)}");
.CleanAsync();
if (handle != null)
{
await workerContext
.ServiceProvider
.GetRequiredService<IdentitySessionCleanupService>()
.CleanAsync();
Logger.LogInformation($"Lock is released for {nameof(IdentitySessionCleanupBackgroundWorker)}");
return;
}
Logger.LogInformation($"Handle is null because of the locking for : {nameof(IdentitySessionCleanupBackgroundWorker)}");
}
} }
} }

19
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IFileAppService.cs

@ -1,19 +0,0 @@
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Content;
namespace LINGYUN.Abp.OssManagement;
public interface IFileAppService : IApplicationService
{
Task<OssObjectDto> UploadAsync(UploadFileInput input);
Task<IRemoteStreamContent> GetAsync(GetPublicFileInput input);
Task<ListResultDto<OssObjectDto>> GetListAsync(GetFilesInput input);
Task UploadChunkAsync(UploadFileChunkInput input);
Task DeleteAsync(GetPublicFileInput input);
}

14
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IPrivateFileAppService.cs

@ -1,10 +1,22 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Content;
namespace LINGYUN.Abp.OssManagement; namespace LINGYUN.Abp.OssManagement;
public interface IPrivateFileAppService : IFileAppService public interface IPrivateFileAppService : IApplicationService
{ {
Task<OssObjectDto> UploadAsync(UploadFileInput input);
Task<IRemoteStreamContent> GetAsync(GetPublicFileInput input);
Task<ListResultDto<OssObjectDto>> GetListAsync(GetFilesInput input);
Task UploadChunkAsync(UploadFileChunkInput input);
Task DeleteAsync(GetPublicFileInput input);
Task<FileShareDto> ShareAsync(FileShareInput input); Task<FileShareDto> ShareAsync(FileShareInput input);
Task<ListResultDto<MyFileShareDto>> GetShareListAsync(); Task<ListResultDto<MyFileShareDto>> GetShareListAsync();

18
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application.Contracts/LINGYUN/Abp/OssManagement/IPublicFileAppService.cs

@ -1,5 +1,19 @@
namespace LINGYUN.Abp.OssManagement; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Content;
public interface IPublicFileAppService : IFileAppService namespace LINGYUN.Abp.OssManagement;
public interface IPublicFileAppService : IApplicationService
{ {
Task<OssObjectDto> UploadAsync(UploadFileInput input);
Task<IRemoteStreamContent> GetAsync(GetPublicFileInput input);
Task<ListResultDto<OssObjectDto>> GetListAsync(GetFilesInput input);
Task UploadChunkAsync(UploadFileChunkInput input);
Task DeleteAsync(GetPublicFileInput input);
} }

2
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.Application/LINGYUN/Abp/OssManagement/FileAppServiceBase.cs

@ -14,7 +14,7 @@ using Volo.Abp.Validation;
namespace LINGYUN.Abp.OssManagement; namespace LINGYUN.Abp.OssManagement;
public abstract class FileAppServiceBase : OssManagementApplicationServiceBase, IFileAppService public abstract class FileAppServiceBase : OssManagementApplicationServiceBase
{ {
protected IFileUploader FileUploader { get; } protected IFileUploader FileUploader { get; }
protected IFileValidater FileValidater { get; } protected IFileValidater FileValidater { get; }

4
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi.Client/ClientProxies/LINGYUN/Abp/OssManagement/PrivateFilesClientProxy.Generated.cs

@ -15,8 +15,8 @@ using Volo.Abp.Http.Modeling;
namespace LINGYUN.Abp.OssManagement; namespace LINGYUN.Abp.OssManagement;
[Dependency(ReplaceServices = true)] [Dependency(ReplaceServices = true)]
[ExposeServices(typeof(IFileAppService), typeof(PrivateFilesClientProxy))] [ExposeServices(typeof(IPrivateFileAppService), typeof(PrivateFilesClientProxy))]
public partial class PrivateFilesClientProxy : ClientProxyBase<IFileAppService>, IFileAppService public partial class PrivateFilesClientProxy : ClientProxyBase<IPrivateFileAppService>, IPrivateFileAppService
{ {
public virtual async Task<OssObjectDto> UploadAsync(UploadFileInput input) public virtual async Task<OssObjectDto> UploadAsync(UploadFileInput input)
{ {

4
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi.Client/ClientProxies/LINGYUN/Abp/OssManagement/PublicFilesClientProxy.Generated.cs

@ -15,8 +15,8 @@ using Volo.Abp.Http.Modeling;
namespace LINGYUN.Abp.OssManagement; namespace LINGYUN.Abp.OssManagement;
[Dependency(ReplaceServices = true)] [Dependency(ReplaceServices = true)]
[ExposeServices(typeof(IFileAppService), typeof(PublicFilesClientProxy))] [ExposeServices(typeof(IPublicFileAppService), typeof(PublicFilesClientProxy))]
public partial class PublicFilesClientProxy : ClientProxyBase<IFileAppService>, IFileAppService public partial class PublicFilesClientProxy : ClientProxyBase<IPublicFileAppService>, IPublicFileAppService
{ {
public virtual async Task<OssObjectDto> UploadAsync(UploadFileInput input) public virtual async Task<OssObjectDto> UploadAsync(UploadFileInput input)
{ {

182
aspnet-core/modules/oss-management/LINGYUN.Abp.OssManagement.HttpApi.Client/ClientProxies/oss-management-generate-proxy.json

@ -1694,97 +1694,6 @@
} }
} }
] ]
},
{
"type": "LINGYUN.Abp.OssManagement.IFileAppService",
"name": "IFileAppService",
"methods": [
{
"name": "UploadAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.UploadFileInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.UploadFileInput",
"typeSimple": "LINGYUN.Abp.OssManagement.UploadFileInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "LINGYUN.Abp.OssManagement.OssObjectDto",
"typeSimple": "LINGYUN.Abp.OssManagement.OssObjectDto"
}
},
{
"name": "GetAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.GetPublicFileInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.GetPublicFileInput",
"typeSimple": "LINGYUN.Abp.OssManagement.GetPublicFileInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "Volo.Abp.Content.IRemoteStreamContent",
"typeSimple": "Volo.Abp.Content.IRemoteStreamContent"
}
},
{
"name": "GetListAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.GetFilesInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.GetFilesInput",
"typeSimple": "LINGYUN.Abp.OssManagement.GetFilesInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "Volo.Abp.Application.Dtos.ListResultDto<LINGYUN.Abp.OssManagement.OssObjectDto>",
"typeSimple": "Volo.Abp.Application.Dtos.ListResultDto<LINGYUN.Abp.OssManagement.OssObjectDto>"
}
},
{
"name": "UploadChunkAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.UploadFileChunkInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.UploadFileChunkInput",
"typeSimple": "LINGYUN.Abp.OssManagement.UploadFileChunkInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "System.Void",
"typeSimple": "System.Void"
}
},
{
"name": "DeleteAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.GetPublicFileInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.GetPublicFileInput",
"typeSimple": "LINGYUN.Abp.OssManagement.GetPublicFileInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "System.Void",
"typeSimple": "System.Void"
}
}
]
} }
], ],
"actions": { "actions": {
@ -2317,97 +2226,6 @@
} }
} }
] ]
},
{
"type": "LINGYUN.Abp.OssManagement.IFileAppService",
"name": "IFileAppService",
"methods": [
{
"name": "UploadAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.UploadFileInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.UploadFileInput",
"typeSimple": "LINGYUN.Abp.OssManagement.UploadFileInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "LINGYUN.Abp.OssManagement.OssObjectDto",
"typeSimple": "LINGYUN.Abp.OssManagement.OssObjectDto"
}
},
{
"name": "GetAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.GetPublicFileInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.GetPublicFileInput",
"typeSimple": "LINGYUN.Abp.OssManagement.GetPublicFileInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "Volo.Abp.Content.IRemoteStreamContent",
"typeSimple": "Volo.Abp.Content.IRemoteStreamContent"
}
},
{
"name": "GetListAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.GetFilesInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.GetFilesInput",
"typeSimple": "LINGYUN.Abp.OssManagement.GetFilesInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "Volo.Abp.Application.Dtos.ListResultDto<LINGYUN.Abp.OssManagement.OssObjectDto>",
"typeSimple": "Volo.Abp.Application.Dtos.ListResultDto<LINGYUN.Abp.OssManagement.OssObjectDto>"
}
},
{
"name": "UploadChunkAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.UploadFileChunkInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.UploadFileChunkInput",
"typeSimple": "LINGYUN.Abp.OssManagement.UploadFileChunkInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "System.Void",
"typeSimple": "System.Void"
}
},
{
"name": "DeleteAsync",
"parametersOnMethod": [
{
"name": "input",
"typeAsString": "LINGYUN.Abp.OssManagement.GetPublicFileInput, LINGYUN.Abp.OssManagement.Application.Contracts",
"type": "LINGYUN.Abp.OssManagement.GetPublicFileInput",
"typeSimple": "LINGYUN.Abp.OssManagement.GetPublicFileInput",
"isOptional": false,
"defaultValue": null
}
],
"returnValue": {
"type": "System.Void",
"typeSimple": "System.Void"
}
}
]
} }
], ],
"actions": { "actions": {

6
aspnet-core/modules/platform/LINGYUN.Platform.Domain/LINGYUN/Platform/Messages/EmailMessageManager.cs

@ -81,7 +81,11 @@ public class EmailMessageManager : DomainService, IEmailMessageManager
if (!message.CC.IsNullOrWhiteSpace()) if (!message.CC.IsNullOrWhiteSpace())
{ {
mailMessage.CC.Add(message.CC); var ccAddresses = message.CC.Split(new[] { ',', ';' }, StringSplitOptions.RemoveEmptyEntries);
foreach (var address in ccAddresses)
{
mailMessage.CC.Add(address.Trim());
}
} }
if (message.Priority.HasValue) if (message.Priority.HasValue)

2
aspnet-core/modules/realtime-notifications/LINGYUN.Abp.Notifications.Templating/LINGYUN.Abp.Notifications.Templating.csproj

@ -4,7 +4,7 @@
<Import Project="..\..\..\..\common.props" /> <Import Project="..\..\..\..\common.props" />
<PropertyGroup> <PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net8.0</TargetFrameworks> <TargetFrameworks>netstandard2.0;netstandard2.1;net8.0;net9.0</TargetFrameworks>
<AssemblyName>LINGYUN.Abp.Notifications.Templating</AssemblyName> <AssemblyName>LINGYUN.Abp.Notifications.Templating</AssemblyName>
<PackageId>LINGYUN.Abp.Notifications.Templating</PackageId> <PackageId>LINGYUN.Abp.Notifications.Templating</PackageId>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute> <GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>

Loading…
Cancel
Save