mirror of https://github.com/abpframework/abp.git
committed by
GitHub
90 changed files with 2390 additions and 171 deletions
@ -1,3 +1,9 @@ |
|||||
@using Volo.Abp.Ui.Branding |
@using Volo.Abp.Ui.Branding |
||||
@inject IBrandingProvider BrandingProvider |
@inject IBrandingProvider BrandingProvider |
||||
<a class="navbar-brand" href="">@BrandingProvider.AppName</a> |
<a class="navbar-brand" href=""> |
||||
|
@if (!BrandingProvider.LogoUrl.IsNullOrWhiteSpace()) |
||||
|
{ |
||||
|
<img src="@BrandingProvider.LogoUrl" alt="@BrandingProvider.AppName" > |
||||
|
} |
||||
|
@BrandingProvider.AppName |
||||
|
</a> |
||||
|
|||||
@ -0,0 +1,49 @@ |
|||||
|
using System; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Microsoft.AspNetCore.Mvc.Rendering; |
||||
|
using Microsoft.AspNetCore.Mvc.ViewFeatures; |
||||
|
using Microsoft.AspNetCore.Razor.TagHelpers; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
|
||||
|
namespace Volo.Abp.AspNetCore.Mvc.UI.Bootstrap.TagHelpers.Form |
||||
|
{ |
||||
|
[HtmlTargetElement(Attributes = "abp-id-name")] |
||||
|
public class AbpIdNameTagHelper : AbpTagHelper |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Make sure this TagHelper is executed first.
|
||||
|
/// </summary>
|
||||
|
public override int Order => -1000 - 1; |
||||
|
|
||||
|
[HtmlAttributeName("abp-id-name")] |
||||
|
public ModelExpression IdNameFor { get; set; } |
||||
|
|
||||
|
private readonly MvcViewOptions _mvcViewOptions; |
||||
|
|
||||
|
public AbpIdNameTagHelper(IOptions<MvcViewOptions> mvcViewOptions) |
||||
|
{ |
||||
|
_mvcViewOptions = mvcViewOptions.Value; |
||||
|
} |
||||
|
|
||||
|
public override Task ProcessAsync(TagHelperContext context, TagHelperOutput output) |
||||
|
{ |
||||
|
if (IdNameFor != null) |
||||
|
{ |
||||
|
if (!context.AllAttributes.Any(x => x.Name.Equals("id", StringComparison.OrdinalIgnoreCase))) |
||||
|
{ |
||||
|
var id = TagBuilder.CreateSanitizedId(IdNameFor.Name, _mvcViewOptions.HtmlHelperOptions.IdAttributeDotReplacement); |
||||
|
output.Attributes.Add("id", id); |
||||
|
} |
||||
|
|
||||
|
if (!context.AllAttributes.Any(x => x.Name.Equals("name", StringComparison.OrdinalIgnoreCase))) |
||||
|
{ |
||||
|
output.Attributes.Add("name", IdNameFor.Name); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return Task.CompletedTask; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -1,3 +1,9 @@ |
|||||
@using Volo.Abp.Ui.Branding |
@using Volo.Abp.Ui.Branding |
||||
@inject IBrandingProvider BrandingProvider |
@inject IBrandingProvider BrandingProvider |
||||
<a class="navbar-brand" href="~/">@BrandingProvider.AppName</a> |
<a class="navbar-brand" href="~/"> |
||||
|
@if (!BrandingProvider.LogoUrl.IsNullOrWhiteSpace()) |
||||
|
{ |
||||
|
<img src="@BrandingProvider.LogoUrl" alt="@BrandingProvider.AppName" > |
||||
|
} |
||||
|
@BrandingProvider.AppName |
||||
|
</a> |
||||
|
|||||
@ -0,0 +1,26 @@ |
|||||
|
using System.Linq; |
||||
|
using Hangfire; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
using Volo.Abp.DependencyInjection; |
||||
|
|
||||
|
namespace Volo.Abp.BackgroundJobs.Hangfire |
||||
|
{ |
||||
|
public class AbpDashboardOptionsProvider : ITransientDependency |
||||
|
{ |
||||
|
protected AbpBackgroundJobOptions AbpBackgroundJobOptions { get; } |
||||
|
|
||||
|
public AbpDashboardOptionsProvider(IOptions<AbpBackgroundJobOptions> abpBackgroundJobOptions) |
||||
|
{ |
||||
|
AbpBackgroundJobOptions = abpBackgroundJobOptions.Value; |
||||
|
} |
||||
|
|
||||
|
public virtual DashboardOptions Get() |
||||
|
{ |
||||
|
return new DashboardOptions |
||||
|
{ |
||||
|
DisplayNameFunc = (dashboardContext, job) => |
||||
|
AbpBackgroundJobOptions.GetJob(job.Args.First().GetType()).JobName |
||||
|
}; |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,40 @@ |
|||||
|
using System.Collections.Generic; |
||||
|
using System.Threading; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.Domain.Entities; |
||||
|
using Volo.Abp.EntityFrameworkCore; |
||||
|
|
||||
|
namespace Volo.Abp.Domain.Repositories.EntityFrameworkCore |
||||
|
{ |
||||
|
public interface IEfCoreBulkOperationProvider |
||||
|
{ |
||||
|
Task InsertManyAsync<TDbContext, TEntity>( |
||||
|
IEfCoreRepository<TEntity> repository, |
||||
|
IEnumerable<TEntity> entities, |
||||
|
bool autoSave, |
||||
|
CancellationToken cancellationToken |
||||
|
) |
||||
|
where TDbContext : IEfCoreDbContext |
||||
|
where TEntity : class, IEntity; |
||||
|
|
||||
|
|
||||
|
Task UpdateManyAsync<TDbContext, TEntity>( |
||||
|
IEfCoreRepository<TEntity> repository, |
||||
|
IEnumerable<TEntity> entities, |
||||
|
bool autoSave, |
||||
|
CancellationToken cancellationToken |
||||
|
) |
||||
|
where TDbContext : IEfCoreDbContext |
||||
|
where TEntity : class, IEntity; |
||||
|
|
||||
|
|
||||
|
Task DeleteManyAsync<TDbContext, TEntity>( |
||||
|
IEfCoreRepository<TEntity> repository, |
||||
|
IEnumerable<TEntity> entities, |
||||
|
bool autoSave, |
||||
|
CancellationToken cancellationToken |
||||
|
) |
||||
|
where TDbContext : IEfCoreDbContext |
||||
|
where TEntity : class, IEntity; |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,39 @@ |
|||||
|
using MongoDB.Driver; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Threading; |
||||
|
using System.Threading.Tasks; |
||||
|
using Volo.Abp.Domain.Entities; |
||||
|
using Volo.Abp.Domain.Repositories.MongoDB; |
||||
|
|
||||
|
namespace Volo.Abp.MongoDB.Volo.Abp.Domain.Repositories.MongoDB |
||||
|
{ |
||||
|
public interface IMongoDbBulkOperationProvider |
||||
|
{ |
||||
|
Task InsertManyAsync<TEntity>( |
||||
|
IMongoDbRepository<TEntity> repository, |
||||
|
IEnumerable<TEntity> entities, |
||||
|
IClientSessionHandle sessionHandle, |
||||
|
bool autoSave, |
||||
|
CancellationToken cancellationToken |
||||
|
) |
||||
|
where TEntity : class, IEntity; |
||||
|
|
||||
|
Task UpdateManyAsync<TEntity>( |
||||
|
IMongoDbRepository<TEntity> repository, |
||||
|
IEnumerable<TEntity> entities, |
||||
|
IClientSessionHandle sessionHandle, |
||||
|
bool autoSave, |
||||
|
CancellationToken cancellationToken |
||||
|
) |
||||
|
where TEntity : class, IEntity; |
||||
|
|
||||
|
Task DeleteManyAsync<TEntity>( |
||||
|
IMongoDbRepository<TEntity> repository, |
||||
|
IEnumerable<TEntity> entities, |
||||
|
IClientSessionHandle sessionHandle, |
||||
|
bool autoSave, |
||||
|
CancellationToken cancellationToken |
||||
|
) |
||||
|
where TEntity : class, IEntity; |
||||
|
} |
||||
|
} |
||||
@ -1,12 +1,17 @@ |
|||||
namespace Volo.Abp.UI.Navigation.Urls |
using System.Collections.Generic; |
||||
|
|
||||
|
namespace Volo.Abp.UI.Navigation.Urls |
||||
{ |
{ |
||||
public class AppUrlOptions |
public class AppUrlOptions |
||||
{ |
{ |
||||
public ApplicationUrlDictionary Applications { get; } |
public ApplicationUrlDictionary Applications { get; } |
||||
|
|
||||
|
public List<string> RedirectAllowedUrls { get; } |
||||
|
|
||||
public AppUrlOptions() |
public AppUrlOptions() |
||||
{ |
{ |
||||
Applications = new ApplicationUrlDictionary(); |
Applications = new ApplicationUrlDictionary(); |
||||
|
RedirectAllowedUrls = new List<string>(); |
||||
} |
} |
||||
} |
} |
||||
} |
} |
||||
|
|||||
@ -0,0 +1,17 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk.Web"> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>net5.0</TargetFramework> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="Volo.Abp.AspNetCore.Mvc" Version="4.0.2" /> |
||||
|
<PackageReference Include="Volo.Abp.Autofac" Version="4.0.2" /> |
||||
|
<PackageReference Include="Volo.Abp.EntityFrameworkCore.SqlServer" Version="4.0.2" /> |
||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.1"> |
||||
|
<PrivateAssets>all</PrivateAssets> |
||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |
||||
|
</PackageReference> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,55 @@ |
|||||
|
using AbpPerfTest.WithAbp.EntityFramework; |
||||
|
using Microsoft.AspNetCore.Builder; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Microsoft.Extensions.Hosting; |
||||
|
using Volo.Abp; |
||||
|
using Volo.Abp.AspNetCore.Mvc; |
||||
|
using Volo.Abp.Autofac; |
||||
|
using Volo.Abp.EntityFrameworkCore; |
||||
|
using Volo.Abp.EntityFrameworkCore.SqlServer; |
||||
|
using Volo.Abp.Modularity; |
||||
|
using Volo.Abp.Uow; |
||||
|
|
||||
|
namespace AbpPerfTest.WithAbp |
||||
|
{ |
||||
|
[DependsOn( |
||||
|
typeof(AbpAspNetCoreMvcModule), |
||||
|
typeof(AbpAutofacModule), |
||||
|
typeof(AbpEntityFrameworkCoreSqlServerModule) |
||||
|
)] |
||||
|
public class AppModule : AbpModule |
||||
|
{ |
||||
|
public override void ConfigureServices(ServiceConfigurationContext context) |
||||
|
{ |
||||
|
context.Services.AddAbpDbContext<BookDbContext>(options => |
||||
|
{ |
||||
|
options.AddDefaultRepositories(); |
||||
|
}); |
||||
|
|
||||
|
Configure<AbpDbContextOptions>(options => |
||||
|
{ |
||||
|
options.UseSqlServer(); |
||||
|
}); |
||||
|
|
||||
|
Configure<AbpUnitOfWorkDefaultOptions>(options => |
||||
|
{ |
||||
|
options.TransactionBehavior = UnitOfWorkTransactionBehavior.Disabled; |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
public override void OnApplicationInitialization(ApplicationInitializationContext context) |
||||
|
{ |
||||
|
var app = context.GetApplicationBuilder(); |
||||
|
var env = context.GetEnvironment(); |
||||
|
|
||||
|
if (env.IsDevelopment()) |
||||
|
{ |
||||
|
app.UseDeveloperExceptionPage(); |
||||
|
} |
||||
|
|
||||
|
app.UseRouting(); |
||||
|
|
||||
|
app.UseConfiguredEndpoints(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,87 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using AbpPerfTest.WithAbp.Dtos; |
||||
|
using AbpPerfTest.WithAbp.Entities; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Volo.Abp.Domain.Repositories; |
||||
|
|
||||
|
namespace AbpPerfTest.WithAbp.Controllers |
||||
|
{ |
||||
|
[Route("api/books")] |
||||
|
public class BookController : Controller |
||||
|
{ |
||||
|
private readonly IRepository<Book, Guid> _bookRepository; |
||||
|
|
||||
|
public BookController(IRepository<Book, Guid> bookRepository) |
||||
|
{ |
||||
|
_bookRepository = bookRepository; |
||||
|
} |
||||
|
|
||||
|
[HttpGet] |
||||
|
public async Task<List<BookDto>> GetListAsync() |
||||
|
{ |
||||
|
var books = await _bookRepository.OrderBy(x => x.Id).Take(10).ToListAsync(); |
||||
|
|
||||
|
return books |
||||
|
.Select(b => new BookDto |
||||
|
{ |
||||
|
Id = b.Id, |
||||
|
Name = b.Name, |
||||
|
Price = b.Price, |
||||
|
IsAvailable = b.IsAvailable |
||||
|
}) |
||||
|
.ToList(); |
||||
|
} |
||||
|
|
||||
|
[HttpGet] |
||||
|
[Route("{id}")] |
||||
|
public async Task<BookDto> GetAsync(Guid id) |
||||
|
{ |
||||
|
var book = await _bookRepository.GetAsync(id); |
||||
|
|
||||
|
return new BookDto |
||||
|
{ |
||||
|
Id = book.Id, |
||||
|
Name = book.Name, |
||||
|
Price = book.Price, |
||||
|
IsAvailable = book.IsAvailable |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
[HttpPost] |
||||
|
public async Task<Guid> CreateAsync([FromBody] CreateUpdateBookDto input) |
||||
|
{ |
||||
|
var book = new Book |
||||
|
{ |
||||
|
Name = input.Name, |
||||
|
Price = input.Price, |
||||
|
IsAvailable = input.IsAvailable |
||||
|
}; |
||||
|
|
||||
|
await _bookRepository.InsertAsync(book); |
||||
|
|
||||
|
return book.Id; |
||||
|
} |
||||
|
|
||||
|
[HttpPut] |
||||
|
[Route("{id}")] |
||||
|
public async Task UpdateAsync(Guid id, [FromBody] CreateUpdateBookDto input) |
||||
|
{ |
||||
|
var book = await _bookRepository.GetAsync(id); |
||||
|
|
||||
|
book.Name = input.Name; |
||||
|
book.Price = input.Price; |
||||
|
book.IsAvailable = input.IsAvailable; |
||||
|
} |
||||
|
|
||||
|
[HttpDelete] |
||||
|
[Route("{id}")] |
||||
|
public async Task DeleteAsync(Guid id) |
||||
|
{ |
||||
|
await _bookRepository.DeleteAsync(id); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,14 @@ |
|||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
|
||||
|
namespace AbpPerfTest.WithAbp.Controllers |
||||
|
{ |
||||
|
[Route("")] |
||||
|
public class HomeController : Controller |
||||
|
{ |
||||
|
[HttpGet] |
||||
|
public ActionResult Index() |
||||
|
{ |
||||
|
return Redirect("/api/books/"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
using System; |
||||
|
|
||||
|
namespace AbpPerfTest.WithAbp.Dtos |
||||
|
{ |
||||
|
public class BookDto |
||||
|
{ |
||||
|
public Guid Id { get; set; } |
||||
|
|
||||
|
public string Name { get; set; } |
||||
|
|
||||
|
public float Price { get; set; } |
||||
|
|
||||
|
public bool IsAvailable { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
namespace AbpPerfTest.WithAbp.Dtos |
||||
|
{ |
||||
|
public class CreateUpdateBookDto |
||||
|
{ |
||||
|
public string Name { get; set; } |
||||
|
|
||||
|
public float Price { get; set; } |
||||
|
|
||||
|
public bool IsAvailable { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
using System; |
||||
|
using Volo.Abp.Domain.Entities; |
||||
|
|
||||
|
namespace AbpPerfTest.WithAbp.Entities |
||||
|
{ |
||||
|
public class Book : BasicAggregateRoot<Guid> |
||||
|
{ |
||||
|
public string Name { get; set; } |
||||
|
|
||||
|
public float Price { get; set; } |
||||
|
|
||||
|
public bool IsAvailable { get; set; } |
||||
|
|
||||
|
public Book() |
||||
|
{ |
||||
|
Id = Guid.NewGuid(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,28 @@ |
|||||
|
using AbpPerfTest.WithAbp.Entities; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Volo.Abp.EntityFrameworkCore; |
||||
|
|
||||
|
namespace AbpPerfTest.WithAbp.EntityFramework |
||||
|
{ |
||||
|
public class BookDbContext : AbpDbContext<BookDbContext> |
||||
|
{ |
||||
|
public DbSet<Book> Books { get; set; } |
||||
|
|
||||
|
public BookDbContext(DbContextOptions<BookDbContext> builderOptions) |
||||
|
: base(builderOptions) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
protected override void OnModelCreating(ModelBuilder modelBuilder) |
||||
|
{ |
||||
|
base.OnModelCreating(modelBuilder); |
||||
|
|
||||
|
modelBuilder.Entity<Book>(b => |
||||
|
{ |
||||
|
b.ToTable("Books"); |
||||
|
b.Property(x => x.Name).HasMaxLength(128); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,29 @@ |
|||||
|
using System.IO; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Microsoft.EntityFrameworkCore.Design; |
||||
|
using Microsoft.Extensions.Configuration; |
||||
|
|
||||
|
namespace AbpPerfTest.WithAbp.EntityFramework |
||||
|
{ |
||||
|
public class BookDbContextFactory : IDesignTimeDbContextFactory<BookDbContext> |
||||
|
{ |
||||
|
public BookDbContext CreateDbContext(string[] args) |
||||
|
{ |
||||
|
var configuration = BuildConfiguration(); |
||||
|
|
||||
|
var builder = new DbContextOptionsBuilder<BookDbContext>() |
||||
|
.UseSqlServer(configuration.GetConnectionString("Default")); |
||||
|
|
||||
|
return new BookDbContext(builder.Options); |
||||
|
} |
||||
|
|
||||
|
private static IConfigurationRoot BuildConfiguration() |
||||
|
{ |
||||
|
var builder = new ConfigurationBuilder() |
||||
|
.SetBasePath(Directory.GetCurrentDirectory()) |
||||
|
.AddJsonFile("appsettings.json", optional: false); |
||||
|
|
||||
|
return builder.Build(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,48 @@ |
|||||
|
// <auto-generated />
|
||||
|
using System; |
||||
|
using AbpPerfTest.WithAbp.EntityFramework; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Microsoft.EntityFrameworkCore.Infrastructure; |
||||
|
using Microsoft.EntityFrameworkCore.Metadata; |
||||
|
using Microsoft.EntityFrameworkCore.Migrations; |
||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |
||||
|
using Volo.Abp.EntityFrameworkCore; |
||||
|
|
||||
|
namespace AbpPerfTest.WithAbp.Migrations |
||||
|
{ |
||||
|
[DbContext(typeof(BookDbContext))] |
||||
|
[Migration("20201222135738_Added_Books")] |
||||
|
partial class Added_Books |
||||
|
{ |
||||
|
protected override void BuildTargetModel(ModelBuilder modelBuilder) |
||||
|
{ |
||||
|
#pragma warning disable 612, 618
|
||||
|
modelBuilder |
||||
|
.UseIdentityColumns() |
||||
|
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) |
||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 128) |
||||
|
.HasAnnotation("ProductVersion", "5.0.1"); |
||||
|
|
||||
|
modelBuilder.Entity("AbpPerfTest.WithAbp.Entities.Book", b => |
||||
|
{ |
||||
|
b.Property<Guid>("Id") |
||||
|
.HasColumnType("uniqueidentifier"); |
||||
|
|
||||
|
b.Property<bool>("IsAvailable") |
||||
|
.HasColumnType("bit"); |
||||
|
|
||||
|
b.Property<string>("Name") |
||||
|
.HasMaxLength(128) |
||||
|
.HasColumnType("nvarchar(128)"); |
||||
|
|
||||
|
b.Property<float>("Price") |
||||
|
.HasColumnType("real"); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.ToTable("Books"); |
||||
|
}); |
||||
|
#pragma warning restore 612, 618
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,31 @@ |
|||||
|
using System; |
||||
|
using Microsoft.EntityFrameworkCore.Migrations; |
||||
|
|
||||
|
namespace AbpPerfTest.WithAbp.Migrations |
||||
|
{ |
||||
|
public partial class Added_Books : Migration |
||||
|
{ |
||||
|
protected override void Up(MigrationBuilder migrationBuilder) |
||||
|
{ |
||||
|
migrationBuilder.CreateTable( |
||||
|
name: "Books", |
||||
|
columns: table => new |
||||
|
{ |
||||
|
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false), |
||||
|
Name = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: true), |
||||
|
Price = table.Column<float>(type: "real", nullable: false), |
||||
|
IsAvailable = table.Column<bool>(type: "bit", nullable: false) |
||||
|
}, |
||||
|
constraints: table => |
||||
|
{ |
||||
|
table.PrimaryKey("PK_Books", x => x.Id); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
protected override void Down(MigrationBuilder migrationBuilder) |
||||
|
{ |
||||
|
migrationBuilder.DropTable( |
||||
|
name: "Books"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,46 @@ |
|||||
|
// <auto-generated />
|
||||
|
using System; |
||||
|
using AbpPerfTest.WithAbp.EntityFramework; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Microsoft.EntityFrameworkCore.Infrastructure; |
||||
|
using Microsoft.EntityFrameworkCore.Metadata; |
||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |
||||
|
using Volo.Abp.EntityFrameworkCore; |
||||
|
|
||||
|
namespace AbpPerfTest.WithAbp.Migrations |
||||
|
{ |
||||
|
[DbContext(typeof(BookDbContext))] |
||||
|
partial class BookDbContextModelSnapshot : ModelSnapshot |
||||
|
{ |
||||
|
protected override void BuildModel(ModelBuilder modelBuilder) |
||||
|
{ |
||||
|
#pragma warning disable 612, 618
|
||||
|
modelBuilder |
||||
|
.UseIdentityColumns() |
||||
|
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.SqlServer) |
||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 128) |
||||
|
.HasAnnotation("ProductVersion", "5.0.1"); |
||||
|
|
||||
|
modelBuilder.Entity("AbpPerfTest.WithAbp.Entities.Book", b => |
||||
|
{ |
||||
|
b.Property<Guid>("Id") |
||||
|
.HasColumnType("uniqueidentifier"); |
||||
|
|
||||
|
b.Property<bool>("IsAvailable") |
||||
|
.HasColumnType("bit"); |
||||
|
|
||||
|
b.Property<string>("Name") |
||||
|
.HasMaxLength(128) |
||||
|
.HasColumnType("nvarchar(128)"); |
||||
|
|
||||
|
b.Property<float>("Price") |
||||
|
.HasColumnType("real"); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.ToTable("Books"); |
||||
|
}); |
||||
|
#pragma warning restore 612, 618
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,21 @@ |
|||||
|
using Microsoft.AspNetCore.Hosting; |
||||
|
using Microsoft.Extensions.Hosting; |
||||
|
|
||||
|
namespace AbpPerfTest.WithAbp |
||||
|
{ |
||||
|
public class Program |
||||
|
{ |
||||
|
public static void Main(string[] args) |
||||
|
{ |
||||
|
CreateHostBuilder(args).Build().Run(); |
||||
|
} |
||||
|
|
||||
|
public static IHostBuilder CreateHostBuilder(string[] args) => |
||||
|
Host.CreateDefaultBuilder(args) |
||||
|
.ConfigureWebHostDefaults(webBuilder => |
||||
|
{ |
||||
|
webBuilder.UseStartup<Startup>(); |
||||
|
}) |
||||
|
.UseAutofac(); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,28 @@ |
|||||
|
{ |
||||
|
"iisSettings": { |
||||
|
"windowsAuthentication": false, |
||||
|
"anonymousAuthentication": true, |
||||
|
"iisExpress": { |
||||
|
"applicationUrl": "http://localhost:50732", |
||||
|
"sslPort": 44312 |
||||
|
} |
||||
|
}, |
||||
|
"profiles": { |
||||
|
"IIS Express": { |
||||
|
"commandName": "IISExpress", |
||||
|
"launchBrowser": true, |
||||
|
"environmentVariables": { |
||||
|
"ASPNETCORE_ENVIRONMENT": "Development" |
||||
|
} |
||||
|
}, |
||||
|
"AbpPerfTest.WithAbp": { |
||||
|
"commandName": "Project", |
||||
|
"dotnetRunMessages": "true", |
||||
|
"launchBrowser": true, |
||||
|
"applicationUrl": "https://localhost:5001;http://localhost:5000", |
||||
|
"environmentVariables": { |
||||
|
"ASPNETCORE_ENVIRONMENT": "Development" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,18 @@ |
|||||
|
using Microsoft.AspNetCore.Builder; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
|
||||
|
namespace AbpPerfTest.WithAbp |
||||
|
{ |
||||
|
public class Startup |
||||
|
{ |
||||
|
public void ConfigureServices(IServiceCollection services) |
||||
|
{ |
||||
|
services.AddApplication<AppModule>(); |
||||
|
} |
||||
|
|
||||
|
public void Configure(IApplicationBuilder app) |
||||
|
{ |
||||
|
app.InitializeApplication(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
{ |
||||
|
"Logging": { |
||||
|
"LogLevel": { |
||||
|
"Default": "Information", |
||||
|
"Microsoft": "Warning", |
||||
|
"Microsoft.Hosting.Lifetime": "Information" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,13 @@ |
|||||
|
{ |
||||
|
"Logging": { |
||||
|
"LogLevel": { |
||||
|
"Default": "Information", |
||||
|
"Microsoft": "Warning", |
||||
|
"Microsoft.Hosting.Lifetime": "Information" |
||||
|
} |
||||
|
}, |
||||
|
"AllowedHosts": "*", |
||||
|
"ConnectionStrings": { |
||||
|
"Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=AbpPerfTest_WithAbp;Trusted_Connection=True;MultipleActiveResultSets=true" |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
<Project Sdk="Microsoft.NET.Sdk.Web"> |
||||
|
|
||||
|
<PropertyGroup> |
||||
|
<TargetFramework>net5.0</TargetFramework> |
||||
|
</PropertyGroup> |
||||
|
|
||||
|
<ItemGroup> |
||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.1"> |
||||
|
<PrivateAssets>all</PrivateAssets> |
||||
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> |
||||
|
</PackageReference> |
||||
|
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="5.0.1" /> |
||||
|
</ItemGroup> |
||||
|
|
||||
|
</Project> |
||||
@ -0,0 +1,93 @@ |
|||||
|
using System; |
||||
|
using System.Collections.Generic; |
||||
|
using System.Linq; |
||||
|
using System.Threading.Tasks; |
||||
|
using AbpPerfTest.WithoutAbp.Dtos; |
||||
|
using AbpPerfTest.WithoutAbp.Entities; |
||||
|
using AbpPerfTest.WithoutAbp.EntityFramework; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
|
||||
|
namespace AbpPerfTest.WithoutAbp.Controllers |
||||
|
{ |
||||
|
[Route("api/books")] |
||||
|
public class BookController : Controller |
||||
|
{ |
||||
|
private readonly BookDbContext _bookDbContext; |
||||
|
|
||||
|
public BookController(BookDbContext bookDbContext) |
||||
|
{ |
||||
|
_bookDbContext = bookDbContext; |
||||
|
} |
||||
|
|
||||
|
[HttpGet] |
||||
|
public async Task<List<BookDto>> GetListAsync() |
||||
|
{ |
||||
|
var books = await _bookDbContext.Books.OrderBy(x => x.Id).Take(10).ToListAsync(); |
||||
|
|
||||
|
return books |
||||
|
.Select(b => new BookDto |
||||
|
{ |
||||
|
Id = b.Id, |
||||
|
Name = b.Name, |
||||
|
Price = b.Price, |
||||
|
IsAvailable = b.IsAvailable |
||||
|
}) |
||||
|
.ToList(); |
||||
|
} |
||||
|
|
||||
|
[HttpGet] |
||||
|
[Route("{id}")] |
||||
|
public async Task<BookDto> GetAsync(Guid id) |
||||
|
{ |
||||
|
var book = await _bookDbContext.Books.SingleAsync(b => b.Id == id); |
||||
|
|
||||
|
return new BookDto |
||||
|
{ |
||||
|
Id = book.Id, |
||||
|
Name = book.Name, |
||||
|
Price = book.Price, |
||||
|
IsAvailable = book.IsAvailable |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
[HttpPost] |
||||
|
public async Task<Guid> CreateAsync([FromBody] CreateUpdateBookDto input) |
||||
|
{ |
||||
|
var book = new Book |
||||
|
{ |
||||
|
Name = input.Name, |
||||
|
Price = input.Price, |
||||
|
IsAvailable = input.IsAvailable |
||||
|
}; |
||||
|
|
||||
|
await _bookDbContext.Books.AddAsync(book); |
||||
|
await _bookDbContext.SaveChangesAsync(); |
||||
|
|
||||
|
return book.Id; |
||||
|
} |
||||
|
|
||||
|
[HttpPut] |
||||
|
[Route("{id}")] |
||||
|
public async Task UpdateAsync(Guid id, [FromBody] CreateUpdateBookDto input) |
||||
|
{ |
||||
|
var book = await _bookDbContext.Books.SingleAsync(b => b.Id == id); |
||||
|
|
||||
|
book.Name = input.Name; |
||||
|
book.Price = input.Price; |
||||
|
book.IsAvailable = input.IsAvailable; |
||||
|
|
||||
|
await _bookDbContext.SaveChangesAsync(); |
||||
|
} |
||||
|
|
||||
|
[HttpDelete] |
||||
|
[Route("{id}")] |
||||
|
public async Task DeleteAsync(Guid id) |
||||
|
{ |
||||
|
var book = await _bookDbContext.Books.SingleAsync(b => b.Id == id); |
||||
|
|
||||
|
_bookDbContext.Books.Remove(book); |
||||
|
await _bookDbContext.SaveChangesAsync(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,14 @@ |
|||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
|
||||
|
namespace AbpPerfTest.WithoutAbp.Controllers |
||||
|
{ |
||||
|
[Route("")] |
||||
|
public class HomeController : Controller |
||||
|
{ |
||||
|
[HttpGet] |
||||
|
public ActionResult Index() |
||||
|
{ |
||||
|
return Redirect("/api/books/"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,15 @@ |
|||||
|
using System; |
||||
|
|
||||
|
namespace AbpPerfTest.WithoutAbp.Dtos |
||||
|
{ |
||||
|
public class BookDto |
||||
|
{ |
||||
|
public Guid Id { get; set; } |
||||
|
|
||||
|
public string Name { get; set; } |
||||
|
|
||||
|
public float Price { get; set; } |
||||
|
|
||||
|
public bool IsAvailable { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
namespace AbpPerfTest.WithoutAbp.Dtos |
||||
|
{ |
||||
|
public class CreateUpdateBookDto |
||||
|
{ |
||||
|
public string Name { get; set; } |
||||
|
|
||||
|
public float Price { get; set; } |
||||
|
|
||||
|
public bool IsAvailable { get; set; } |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,20 @@ |
|||||
|
using System; |
||||
|
|
||||
|
namespace AbpPerfTest.WithoutAbp.Entities |
||||
|
{ |
||||
|
public class Book |
||||
|
{ |
||||
|
public Guid Id { get; set; } |
||||
|
|
||||
|
public string Name { get; set; } |
||||
|
|
||||
|
public float Price { get; set; } |
||||
|
|
||||
|
public bool IsAvailable { get; set; } |
||||
|
|
||||
|
public Book() |
||||
|
{ |
||||
|
Id = Guid.NewGuid(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,27 @@ |
|||||
|
using AbpPerfTest.WithoutAbp.Entities; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
|
||||
|
namespace AbpPerfTest.WithoutAbp.EntityFramework |
||||
|
{ |
||||
|
public class BookDbContext : DbContext |
||||
|
{ |
||||
|
public DbSet<Book> Books { get; set; } |
||||
|
|
||||
|
public BookDbContext(DbContextOptions<BookDbContext> builderOptions) |
||||
|
: base(builderOptions) |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
protected override void OnModelCreating(ModelBuilder modelBuilder) |
||||
|
{ |
||||
|
base.OnModelCreating(modelBuilder); |
||||
|
|
||||
|
modelBuilder.Entity<Book>(b => |
||||
|
{ |
||||
|
b.ToTable("Books"); |
||||
|
b.Property(x => x.Name).HasMaxLength(128); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,29 @@ |
|||||
|
using System.IO; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Microsoft.EntityFrameworkCore.Design; |
||||
|
using Microsoft.Extensions.Configuration; |
||||
|
|
||||
|
namespace AbpPerfTest.WithoutAbp.EntityFramework |
||||
|
{ |
||||
|
public class BookDbContextFactory : IDesignTimeDbContextFactory<BookDbContext> |
||||
|
{ |
||||
|
public BookDbContext CreateDbContext(string[] args) |
||||
|
{ |
||||
|
var configuration = BuildConfiguration(); |
||||
|
|
||||
|
var builder = new DbContextOptionsBuilder<BookDbContext>() |
||||
|
.UseSqlServer(configuration.GetConnectionString("Default")); |
||||
|
|
||||
|
return new BookDbContext(builder.Options); |
||||
|
} |
||||
|
|
||||
|
private static IConfigurationRoot BuildConfiguration() |
||||
|
{ |
||||
|
var builder = new ConfigurationBuilder() |
||||
|
.SetBasePath(Directory.GetCurrentDirectory()) |
||||
|
.AddJsonFile("appsettings.json", optional: false); |
||||
|
|
||||
|
return builder.Build(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,47 @@ |
|||||
|
// <auto-generated />
|
||||
|
using System; |
||||
|
using AbpPerfTest.WithoutAbp.EntityFramework; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Microsoft.EntityFrameworkCore.Infrastructure; |
||||
|
using Microsoft.EntityFrameworkCore.Metadata; |
||||
|
using Microsoft.EntityFrameworkCore.Migrations; |
||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |
||||
|
|
||||
|
namespace AbpPerfTest.WithoutAbp.Migrations |
||||
|
{ |
||||
|
[DbContext(typeof(BookDbContext))] |
||||
|
[Migration("20201222132615_Added_Books")] |
||||
|
partial class Added_Books |
||||
|
{ |
||||
|
protected override void BuildTargetModel(ModelBuilder modelBuilder) |
||||
|
{ |
||||
|
#pragma warning disable 612, 618
|
||||
|
modelBuilder |
||||
|
.UseIdentityColumns() |
||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 128) |
||||
|
.HasAnnotation("ProductVersion", "5.0.1"); |
||||
|
|
||||
|
modelBuilder.Entity("AbpPerfTest.WithoutAbp.Entities.Book", b => |
||||
|
{ |
||||
|
b.Property<Guid>("Id") |
||||
|
.ValueGeneratedOnAdd() |
||||
|
.HasColumnType("uniqueidentifier"); |
||||
|
|
||||
|
b.Property<bool>("IsAvailable") |
||||
|
.HasColumnType("bit"); |
||||
|
|
||||
|
b.Property<string>("Name") |
||||
|
.HasMaxLength(128) |
||||
|
.HasColumnType("nvarchar(128)"); |
||||
|
|
||||
|
b.Property<float>("Price") |
||||
|
.HasColumnType("real"); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.ToTable("Books"); |
||||
|
}); |
||||
|
#pragma warning restore 612, 618
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,31 @@ |
|||||
|
using System; |
||||
|
using Microsoft.EntityFrameworkCore.Migrations; |
||||
|
|
||||
|
namespace AbpPerfTest.WithoutAbp.Migrations |
||||
|
{ |
||||
|
public partial class Added_Books : Migration |
||||
|
{ |
||||
|
protected override void Up(MigrationBuilder migrationBuilder) |
||||
|
{ |
||||
|
migrationBuilder.CreateTable( |
||||
|
name: "Books", |
||||
|
columns: table => new |
||||
|
{ |
||||
|
Id = table.Column<Guid>(type: "uniqueidentifier", nullable: false), |
||||
|
Name = table.Column<string>(type: "nvarchar(128)", maxLength: 128, nullable: true), |
||||
|
Price = table.Column<float>(type: "real", nullable: false), |
||||
|
IsAvailable = table.Column<bool>(type: "bit", nullable: false) |
||||
|
}, |
||||
|
constraints: table => |
||||
|
{ |
||||
|
table.PrimaryKey("PK_Books", x => x.Id); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
protected override void Down(MigrationBuilder migrationBuilder) |
||||
|
{ |
||||
|
migrationBuilder.DropTable( |
||||
|
name: "Books"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,45 @@ |
|||||
|
// <auto-generated />
|
||||
|
using System; |
||||
|
using AbpPerfTest.WithoutAbp.EntityFramework; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Microsoft.EntityFrameworkCore.Infrastructure; |
||||
|
using Microsoft.EntityFrameworkCore.Metadata; |
||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion; |
||||
|
|
||||
|
namespace AbpPerfTest.WithoutAbp.Migrations |
||||
|
{ |
||||
|
[DbContext(typeof(BookDbContext))] |
||||
|
partial class BookDbContextModelSnapshot : ModelSnapshot |
||||
|
{ |
||||
|
protected override void BuildModel(ModelBuilder modelBuilder) |
||||
|
{ |
||||
|
#pragma warning disable 612, 618
|
||||
|
modelBuilder |
||||
|
.UseIdentityColumns() |
||||
|
.HasAnnotation("Relational:MaxIdentifierLength", 128) |
||||
|
.HasAnnotation("ProductVersion", "5.0.1"); |
||||
|
|
||||
|
modelBuilder.Entity("AbpPerfTest.WithoutAbp.Entities.Book", b => |
||||
|
{ |
||||
|
b.Property<Guid>("Id") |
||||
|
.ValueGeneratedOnAdd() |
||||
|
.HasColumnType("uniqueidentifier"); |
||||
|
|
||||
|
b.Property<bool>("IsAvailable") |
||||
|
.HasColumnType("bit"); |
||||
|
|
||||
|
b.Property<string>("Name") |
||||
|
.HasMaxLength(128) |
||||
|
.HasColumnType("nvarchar(128)"); |
||||
|
|
||||
|
b.Property<float>("Price") |
||||
|
.HasColumnType("real"); |
||||
|
|
||||
|
b.HasKey("Id"); |
||||
|
|
||||
|
b.ToTable("Books"); |
||||
|
}); |
||||
|
#pragma warning restore 612, 618
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,17 @@ |
|||||
|
using Microsoft.AspNetCore.Hosting; |
||||
|
using Microsoft.Extensions.Hosting; |
||||
|
|
||||
|
namespace AbpPerfTest.WithoutAbp |
||||
|
{ |
||||
|
public class Program |
||||
|
{ |
||||
|
public static void Main(string[] args) |
||||
|
{ |
||||
|
CreateHostBuilder(args).Build().Run(); |
||||
|
} |
||||
|
|
||||
|
public static IHostBuilder CreateHostBuilder(string[] args) => |
||||
|
Host.CreateDefaultBuilder(args) |
||||
|
.ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); }); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,28 @@ |
|||||
|
{ |
||||
|
"iisSettings": { |
||||
|
"windowsAuthentication": false, |
||||
|
"anonymousAuthentication": true, |
||||
|
"iisExpress": { |
||||
|
"applicationUrl": "http://localhost:16268", |
||||
|
"sslPort": 44323 |
||||
|
} |
||||
|
}, |
||||
|
"profiles": { |
||||
|
"IIS Express": { |
||||
|
"commandName": "IISExpress", |
||||
|
"launchBrowser": true, |
||||
|
"environmentVariables": { |
||||
|
"ASPNETCORE_ENVIRONMENT": "Development" |
||||
|
} |
||||
|
}, |
||||
|
"AbpPerfTest.WithoutAbp": { |
||||
|
"commandName": "Project", |
||||
|
"dotnetRunMessages": "true", |
||||
|
"launchBrowser": true, |
||||
|
"applicationUrl": "https://localhost:5003;http://localhost:5002", |
||||
|
"environmentVariables": { |
||||
|
"ASPNETCORE_ENVIRONMENT": "Development" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,45 @@ |
|||||
|
using AbpPerfTest.WithoutAbp.EntityFramework; |
||||
|
using Microsoft.AspNetCore.Builder; |
||||
|
using Microsoft.AspNetCore.Hosting; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Microsoft.Extensions.Configuration; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Microsoft.Extensions.Hosting; |
||||
|
|
||||
|
namespace AbpPerfTest.WithoutAbp |
||||
|
{ |
||||
|
public class Startup |
||||
|
{ |
||||
|
private readonly IConfiguration _configuration; |
||||
|
|
||||
|
public Startup(IConfiguration configuration) |
||||
|
{ |
||||
|
_configuration = configuration; |
||||
|
} |
||||
|
|
||||
|
public void ConfigureServices(IServiceCollection services) |
||||
|
{ |
||||
|
services.AddMvc(); |
||||
|
|
||||
|
services.AddDbContext<BookDbContext>(options => |
||||
|
{ |
||||
|
options.UseSqlServer(_configuration.GetConnectionString("Default")); |
||||
|
}); |
||||
|
} |
||||
|
|
||||
|
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) |
||||
|
{ |
||||
|
if (env.IsDevelopment()) |
||||
|
{ |
||||
|
app.UseDeveloperExceptionPage(); |
||||
|
} |
||||
|
|
||||
|
app.UseRouting(); |
||||
|
|
||||
|
app.UseEndpoints(endpoints => |
||||
|
{ |
||||
|
endpoints.MapControllers(); |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,9 @@ |
|||||
|
{ |
||||
|
"Logging": { |
||||
|
"LogLevel": { |
||||
|
"Default": "Information", |
||||
|
"Microsoft": "Warning", |
||||
|
"Microsoft.Hosting.Lifetime": "Information" |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,13 @@ |
|||||
|
{ |
||||
|
"Logging": { |
||||
|
"LogLevel": { |
||||
|
"Default": "Information", |
||||
|
"Microsoft": "Warning", |
||||
|
"Microsoft.Hosting.Lifetime": "Information" |
||||
|
} |
||||
|
}, |
||||
|
"AllowedHosts": "*", |
||||
|
"ConnectionStrings": { |
||||
|
"Default": "Server=(LocalDb)\\MSSQLLocalDB;Database=AbpPerfTest_WithoutAbp;Trusted_Connection=True;MultipleActiveResultSets=true" |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,22 @@ |
|||||
|
|
||||
|
Microsoft Visual Studio Solution File, Format Version 12.00 |
||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AbpPerfTest.WithoutAbp", "AbpPerfTest.WithoutAbp\AbpPerfTest.WithoutAbp.csproj", "{E3406CA0-9B0C-45FC-A3C0-8179A9C4A3E5}" |
||||
|
EndProject |
||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AbpPerfTest.WithAbp", "AbpPerfTest.WithAbp\AbpPerfTest.WithAbp.csproj", "{13021286-B5D8-4A3E-8F36-5256D32638A7}" |
||||
|
EndProject |
||||
|
Global |
||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution |
||||
|
Debug|Any CPU = Debug|Any CPU |
||||
|
Release|Any CPU = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution |
||||
|
{E3406CA0-9B0C-45FC-A3C0-8179A9C4A3E5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{E3406CA0-9B0C-45FC-A3C0-8179A9C4A3E5}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{E3406CA0-9B0C-45FC-A3C0-8179A9C4A3E5}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{E3406CA0-9B0C-45FC-A3C0-8179A9C4A3E5}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
{13021286-B5D8-4A3E-8F36-5256D32638A7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU |
||||
|
{13021286-B5D8-4A3E-8F36-5256D32638A7}.Debug|Any CPU.Build.0 = Debug|Any CPU |
||||
|
{13021286-B5D8-4A3E-8F36-5256D32638A7}.Release|Any CPU.ActiveCfg = Release|Any CPU |
||||
|
{13021286-B5D8-4A3E-8F36-5256D32638A7}.Release|Any CPU.Build.0 = Release|Any CPU |
||||
|
EndGlobalSection |
||||
|
EndGlobal |
||||
@ -0,0 +1,205 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.4"> |
||||
|
<hashTree> |
||||
|
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true"> |
||||
|
<stringProp name="TestPlan.comments"></stringProp> |
||||
|
<boolProp name="TestPlan.functional_mode">false</boolProp> |
||||
|
<boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp> |
||||
|
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp> |
||||
|
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> |
||||
|
<collectionProp name="Arguments.arguments"/> |
||||
|
</elementProp> |
||||
|
<stringProp name="TestPlan.user_define_classpath"></stringProp> |
||||
|
</TestPlan> |
||||
|
<hashTree> |
||||
|
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true"> |
||||
|
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp> |
||||
|
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> |
||||
|
<boolProp name="LoopController.continue_forever">false</boolProp> |
||||
|
<stringProp name="LoopController.loops">100</stringProp> |
||||
|
</elementProp> |
||||
|
<stringProp name="ThreadGroup.num_threads">100</stringProp> |
||||
|
<stringProp name="ThreadGroup.ramp_time">10</stringProp> |
||||
|
<boolProp name="ThreadGroup.scheduler">false</boolProp> |
||||
|
<stringProp name="ThreadGroup.duration"></stringProp> |
||||
|
<stringProp name="ThreadGroup.delay"></stringProp> |
||||
|
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp> |
||||
|
</ThreadGroup> |
||||
|
<hashTree> |
||||
|
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Create a book" enabled="true"> |
||||
|
<boolProp name="HTTPSampler.postBodyRaw">true</boolProp> |
||||
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments"> |
||||
|
<collectionProp name="Arguments.arguments"> |
||||
|
<elementProp name="" elementType="HTTPArgument"> |
||||
|
<boolProp name="HTTPArgument.always_encode">false</boolProp> |
||||
|
<stringProp name="Argument.value">{
 |
||||
|
"name": "${__RandomString(5, abcdefghijklmnopqrstuvwxyz)}",
 |
||||
|
"price": ${__Random(1,999)},
 |
||||
|
"isAvailable": true
 |
||||
|
}
 |
||||
|
</stringProp> |
||||
|
<stringProp name="Argument.metadata">=</stringProp> |
||||
|
</elementProp> |
||||
|
</collectionProp> |
||||
|
</elementProp> |
||||
|
<stringProp name="HTTPSampler.domain">localhost</stringProp> |
||||
|
<stringProp name="HTTPSampler.port">5001</stringProp> |
||||
|
<stringProp name="HTTPSampler.protocol">https</stringProp> |
||||
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp> |
||||
|
<stringProp name="HTTPSampler.path">/api/books/</stringProp> |
||||
|
<stringProp name="HTTPSampler.method">POST</stringProp> |
||||
|
<boolProp name="HTTPSampler.follow_redirects">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp> |
||||
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> |
||||
|
<stringProp name="HTTPSampler.embedded_url_re"></stringProp> |
||||
|
<stringProp name="HTTPSampler.connect_timeout"></stringProp> |
||||
|
<stringProp name="HTTPSampler.response_timeout"></stringProp> |
||||
|
</HTTPSamplerProxy> |
||||
|
<hashTree> |
||||
|
<JSONPostProcessor guiclass="JSONPostProcessorGui" testclass="JSONPostProcessor" testname="Get book id" enabled="true"> |
||||
|
<stringProp name="JSONPostProcessor.referenceNames">BookId</stringProp> |
||||
|
<stringProp name="JSONPostProcessor.jsonPathExprs">$</stringProp> |
||||
|
<stringProp name="JSONPostProcessor.match_numbers"></stringProp> |
||||
|
<stringProp name="Scope.variable"></stringProp> |
||||
|
</JSONPostProcessor> |
||||
|
<hashTree/> |
||||
|
</hashTree> |
||||
|
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Get book by id" enabled="true"> |
||||
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"> |
||||
|
<collectionProp name="Arguments.arguments"/> |
||||
|
</elementProp> |
||||
|
<stringProp name="HTTPSampler.domain">localhost</stringProp> |
||||
|
<stringProp name="HTTPSampler.port">5001</stringProp> |
||||
|
<stringProp name="HTTPSampler.protocol">https</stringProp> |
||||
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp> |
||||
|
<stringProp name="HTTPSampler.path">api/books/${BookId}</stringProp> |
||||
|
<stringProp name="HTTPSampler.method">GET</stringProp> |
||||
|
<boolProp name="HTTPSampler.follow_redirects">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp> |
||||
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> |
||||
|
<stringProp name="HTTPSampler.embedded_url_re"></stringProp> |
||||
|
<stringProp name="HTTPSampler.connect_timeout"></stringProp> |
||||
|
<stringProp name="HTTPSampler.response_timeout"></stringProp> |
||||
|
</HTTPSamplerProxy> |
||||
|
<hashTree/> |
||||
|
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Update a book" enabled="false"> |
||||
|
<boolProp name="HTTPSampler.postBodyRaw">true</boolProp> |
||||
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments"> |
||||
|
<collectionProp name="Arguments.arguments"> |
||||
|
<elementProp name="" elementType="HTTPArgument"> |
||||
|
<boolProp name="HTTPArgument.always_encode">false</boolProp> |
||||
|
<stringProp name="Argument.value">{
 |
||||
|
"name": "${__RandomString(5, abcdefghijklmnopqrstuvwxyz)}",
 |
||||
|
"price": ${__Random(1,999)},
 |
||||
|
"isAvailable": true
 |
||||
|
}
 |
||||
|
</stringProp> |
||||
|
<stringProp name="Argument.metadata">=</stringProp> |
||||
|
</elementProp> |
||||
|
</collectionProp> |
||||
|
</elementProp> |
||||
|
<stringProp name="HTTPSampler.domain">localhost</stringProp> |
||||
|
<stringProp name="HTTPSampler.port">5001</stringProp> |
||||
|
<stringProp name="HTTPSampler.protocol">https</stringProp> |
||||
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp> |
||||
|
<stringProp name="HTTPSampler.path">/api/books/${BookId}</stringProp> |
||||
|
<stringProp name="HTTPSampler.method">PUT</stringProp> |
||||
|
<boolProp name="HTTPSampler.follow_redirects">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp> |
||||
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> |
||||
|
<stringProp name="HTTPSampler.embedded_url_re"></stringProp> |
||||
|
<stringProp name="HTTPSampler.connect_timeout"></stringProp> |
||||
|
<stringProp name="HTTPSampler.response_timeout"></stringProp> |
||||
|
</HTTPSamplerProxy> |
||||
|
<hashTree/> |
||||
|
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Get books" enabled="false"> |
||||
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"> |
||||
|
<collectionProp name="Arguments.arguments"/> |
||||
|
</elementProp> |
||||
|
<stringProp name="HTTPSampler.domain">localhost</stringProp> |
||||
|
<stringProp name="HTTPSampler.port">5001</stringProp> |
||||
|
<stringProp name="HTTPSampler.protocol">https</stringProp> |
||||
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp> |
||||
|
<stringProp name="HTTPSampler.path">/api/books</stringProp> |
||||
|
<stringProp name="HTTPSampler.method">GET</stringProp> |
||||
|
<boolProp name="HTTPSampler.follow_redirects">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp> |
||||
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> |
||||
|
<stringProp name="HTTPSampler.embedded_url_re"></stringProp> |
||||
|
<stringProp name="HTTPSampler.connect_timeout"></stringProp> |
||||
|
<stringProp name="HTTPSampler.response_timeout"></stringProp> |
||||
|
</HTTPSamplerProxy> |
||||
|
<hashTree/> |
||||
|
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Delete a book" enabled="true"> |
||||
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"> |
||||
|
<collectionProp name="Arguments.arguments"/> |
||||
|
</elementProp> |
||||
|
<stringProp name="HTTPSampler.domain">localhost</stringProp> |
||||
|
<stringProp name="HTTPSampler.port">5001</stringProp> |
||||
|
<stringProp name="HTTPSampler.protocol">https</stringProp> |
||||
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp> |
||||
|
<stringProp name="HTTPSampler.path">/api/books/${BookId}</stringProp> |
||||
|
<stringProp name="HTTPSampler.method">DELETE</stringProp> |
||||
|
<boolProp name="HTTPSampler.follow_redirects">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp> |
||||
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> |
||||
|
<stringProp name="HTTPSampler.embedded_url_re"></stringProp> |
||||
|
<stringProp name="HTTPSampler.connect_timeout"></stringProp> |
||||
|
<stringProp name="HTTPSampler.response_timeout"></stringProp> |
||||
|
</HTTPSamplerProxy> |
||||
|
<hashTree/> |
||||
|
</hashTree> |
||||
|
<ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="Summary Report" enabled="true"> |
||||
|
<boolProp name="ResultCollector.error_logging">false</boolProp> |
||||
|
<objProp> |
||||
|
<name>saveConfig</name> |
||||
|
<value class="SampleSaveConfiguration"> |
||||
|
<time>true</time> |
||||
|
<latency>true</latency> |
||||
|
<timestamp>true</timestamp> |
||||
|
<success>true</success> |
||||
|
<label>true</label> |
||||
|
<code>true</code> |
||||
|
<message>true</message> |
||||
|
<threadName>true</threadName> |
||||
|
<dataType>true</dataType> |
||||
|
<encoding>false</encoding> |
||||
|
<assertions>true</assertions> |
||||
|
<subresults>true</subresults> |
||||
|
<responseData>false</responseData> |
||||
|
<samplerData>false</samplerData> |
||||
|
<xml>false</xml> |
||||
|
<fieldNames>true</fieldNames> |
||||
|
<responseHeaders>false</responseHeaders> |
||||
|
<requestHeaders>false</requestHeaders> |
||||
|
<responseDataOnError>false</responseDataOnError> |
||||
|
<saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage> |
||||
|
<assertionsResultsToSave>0</assertionsResultsToSave> |
||||
|
<bytes>true</bytes> |
||||
|
<sentBytes>true</sentBytes> |
||||
|
<url>true</url> |
||||
|
<threadCounts>true</threadCounts> |
||||
|
<idleTime>true</idleTime> |
||||
|
<connectTime>true</connectTime> |
||||
|
</value> |
||||
|
</objProp> |
||||
|
<stringProp name="filename"></stringProp> |
||||
|
</ResultCollector> |
||||
|
<hashTree/> |
||||
|
<HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> |
||||
|
<collectionProp name="HeaderManager.headers"> |
||||
|
<elementProp name="" elementType="Header"> |
||||
|
<stringProp name="Header.name">Content-Type</stringProp> |
||||
|
<stringProp name="Header.value">application/json</stringProp> |
||||
|
</elementProp> |
||||
|
</collectionProp> |
||||
|
</HeaderManager> |
||||
|
<hashTree/> |
||||
|
</hashTree> |
||||
|
</hashTree> |
||||
|
</jmeterTestPlan> |
||||
@ -0,0 +1,205 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.4"> |
||||
|
<hashTree> |
||||
|
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true"> |
||||
|
<stringProp name="TestPlan.comments"></stringProp> |
||||
|
<boolProp name="TestPlan.functional_mode">false</boolProp> |
||||
|
<boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp> |
||||
|
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp> |
||||
|
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true"> |
||||
|
<collectionProp name="Arguments.arguments"/> |
||||
|
</elementProp> |
||||
|
<stringProp name="TestPlan.user_define_classpath"></stringProp> |
||||
|
</TestPlan> |
||||
|
<hashTree> |
||||
|
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true"> |
||||
|
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp> |
||||
|
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true"> |
||||
|
<boolProp name="LoopController.continue_forever">false</boolProp> |
||||
|
<stringProp name="LoopController.loops">100</stringProp> |
||||
|
</elementProp> |
||||
|
<stringProp name="ThreadGroup.num_threads">100</stringProp> |
||||
|
<stringProp name="ThreadGroup.ramp_time">10</stringProp> |
||||
|
<boolProp name="ThreadGroup.scheduler">false</boolProp> |
||||
|
<stringProp name="ThreadGroup.duration"></stringProp> |
||||
|
<stringProp name="ThreadGroup.delay"></stringProp> |
||||
|
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp> |
||||
|
</ThreadGroup> |
||||
|
<hashTree> |
||||
|
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Create a book" enabled="true"> |
||||
|
<boolProp name="HTTPSampler.postBodyRaw">true</boolProp> |
||||
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments"> |
||||
|
<collectionProp name="Arguments.arguments"> |
||||
|
<elementProp name="" elementType="HTTPArgument"> |
||||
|
<boolProp name="HTTPArgument.always_encode">false</boolProp> |
||||
|
<stringProp name="Argument.value">{
 |
||||
|
"name": "${__RandomString(5, abcdefghijklmnopqrstuvwxyz)}",
 |
||||
|
"price": ${__Random(1,999)},
 |
||||
|
"isAvailable": true
 |
||||
|
}
 |
||||
|
</stringProp> |
||||
|
<stringProp name="Argument.metadata">=</stringProp> |
||||
|
</elementProp> |
||||
|
</collectionProp> |
||||
|
</elementProp> |
||||
|
<stringProp name="HTTPSampler.domain">localhost</stringProp> |
||||
|
<stringProp name="HTTPSampler.port">5003</stringProp> |
||||
|
<stringProp name="HTTPSampler.protocol">https</stringProp> |
||||
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp> |
||||
|
<stringProp name="HTTPSampler.path">/api/books/</stringProp> |
||||
|
<stringProp name="HTTPSampler.method">POST</stringProp> |
||||
|
<boolProp name="HTTPSampler.follow_redirects">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp> |
||||
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> |
||||
|
<stringProp name="HTTPSampler.embedded_url_re"></stringProp> |
||||
|
<stringProp name="HTTPSampler.connect_timeout"></stringProp> |
||||
|
<stringProp name="HTTPSampler.response_timeout"></stringProp> |
||||
|
</HTTPSamplerProxy> |
||||
|
<hashTree> |
||||
|
<JSONPostProcessor guiclass="JSONPostProcessorGui" testclass="JSONPostProcessor" testname="Get book id" enabled="true"> |
||||
|
<stringProp name="JSONPostProcessor.referenceNames">BookId</stringProp> |
||||
|
<stringProp name="JSONPostProcessor.jsonPathExprs">$</stringProp> |
||||
|
<stringProp name="JSONPostProcessor.match_numbers"></stringProp> |
||||
|
<stringProp name="Scope.variable"></stringProp> |
||||
|
</JSONPostProcessor> |
||||
|
<hashTree/> |
||||
|
</hashTree> |
||||
|
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Get book by id" enabled="true"> |
||||
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"> |
||||
|
<collectionProp name="Arguments.arguments"/> |
||||
|
</elementProp> |
||||
|
<stringProp name="HTTPSampler.domain">localhost</stringProp> |
||||
|
<stringProp name="HTTPSampler.port">5003</stringProp> |
||||
|
<stringProp name="HTTPSampler.protocol">https</stringProp> |
||||
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp> |
||||
|
<stringProp name="HTTPSampler.path">api/books/${BookId}</stringProp> |
||||
|
<stringProp name="HTTPSampler.method">GET</stringProp> |
||||
|
<boolProp name="HTTPSampler.follow_redirects">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp> |
||||
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> |
||||
|
<stringProp name="HTTPSampler.embedded_url_re"></stringProp> |
||||
|
<stringProp name="HTTPSampler.connect_timeout"></stringProp> |
||||
|
<stringProp name="HTTPSampler.response_timeout"></stringProp> |
||||
|
</HTTPSamplerProxy> |
||||
|
<hashTree/> |
||||
|
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Update a book" enabled="false"> |
||||
|
<boolProp name="HTTPSampler.postBodyRaw">true</boolProp> |
||||
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments"> |
||||
|
<collectionProp name="Arguments.arguments"> |
||||
|
<elementProp name="" elementType="HTTPArgument"> |
||||
|
<boolProp name="HTTPArgument.always_encode">false</boolProp> |
||||
|
<stringProp name="Argument.value">{
 |
||||
|
"name": "${__RandomString(5, abcdefghijklmnopqrstuvwxyz)}",
 |
||||
|
"price": ${__Random(1,999)},
 |
||||
|
"isAvailable": true
 |
||||
|
}
 |
||||
|
</stringProp> |
||||
|
<stringProp name="Argument.metadata">=</stringProp> |
||||
|
</elementProp> |
||||
|
</collectionProp> |
||||
|
</elementProp> |
||||
|
<stringProp name="HTTPSampler.domain">localhost</stringProp> |
||||
|
<stringProp name="HTTPSampler.port">5003</stringProp> |
||||
|
<stringProp name="HTTPSampler.protocol">https</stringProp> |
||||
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp> |
||||
|
<stringProp name="HTTPSampler.path">/api/books/${BookId}</stringProp> |
||||
|
<stringProp name="HTTPSampler.method">PUT</stringProp> |
||||
|
<boolProp name="HTTPSampler.follow_redirects">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp> |
||||
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> |
||||
|
<stringProp name="HTTPSampler.embedded_url_re"></stringProp> |
||||
|
<stringProp name="HTTPSampler.connect_timeout"></stringProp> |
||||
|
<stringProp name="HTTPSampler.response_timeout"></stringProp> |
||||
|
</HTTPSamplerProxy> |
||||
|
<hashTree/> |
||||
|
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Get books" enabled="false"> |
||||
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"> |
||||
|
<collectionProp name="Arguments.arguments"/> |
||||
|
</elementProp> |
||||
|
<stringProp name="HTTPSampler.domain">localhost</stringProp> |
||||
|
<stringProp name="HTTPSampler.port">5003</stringProp> |
||||
|
<stringProp name="HTTPSampler.protocol">https</stringProp> |
||||
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp> |
||||
|
<stringProp name="HTTPSampler.path">/api/books</stringProp> |
||||
|
<stringProp name="HTTPSampler.method">GET</stringProp> |
||||
|
<boolProp name="HTTPSampler.follow_redirects">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp> |
||||
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> |
||||
|
<stringProp name="HTTPSampler.embedded_url_re"></stringProp> |
||||
|
<stringProp name="HTTPSampler.connect_timeout"></stringProp> |
||||
|
<stringProp name="HTTPSampler.response_timeout"></stringProp> |
||||
|
</HTTPSamplerProxy> |
||||
|
<hashTree/> |
||||
|
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="Delete a book" enabled="true"> |
||||
|
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true"> |
||||
|
<collectionProp name="Arguments.arguments"/> |
||||
|
</elementProp> |
||||
|
<stringProp name="HTTPSampler.domain">localhost</stringProp> |
||||
|
<stringProp name="HTTPSampler.port">5003</stringProp> |
||||
|
<stringProp name="HTTPSampler.protocol">https</stringProp> |
||||
|
<stringProp name="HTTPSampler.contentEncoding"></stringProp> |
||||
|
<stringProp name="HTTPSampler.path">/api/books/${BookId}</stringProp> |
||||
|
<stringProp name="HTTPSampler.method">DELETE</stringProp> |
||||
|
<boolProp name="HTTPSampler.follow_redirects">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.auto_redirects">false</boolProp> |
||||
|
<boolProp name="HTTPSampler.use_keepalive">true</boolProp> |
||||
|
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp> |
||||
|
<stringProp name="HTTPSampler.embedded_url_re"></stringProp> |
||||
|
<stringProp name="HTTPSampler.connect_timeout"></stringProp> |
||||
|
<stringProp name="HTTPSampler.response_timeout"></stringProp> |
||||
|
</HTTPSamplerProxy> |
||||
|
<hashTree/> |
||||
|
</hashTree> |
||||
|
<ResultCollector guiclass="SummaryReport" testclass="ResultCollector" testname="Summary Report" enabled="true"> |
||||
|
<boolProp name="ResultCollector.error_logging">false</boolProp> |
||||
|
<objProp> |
||||
|
<name>saveConfig</name> |
||||
|
<value class="SampleSaveConfiguration"> |
||||
|
<time>true</time> |
||||
|
<latency>true</latency> |
||||
|
<timestamp>true</timestamp> |
||||
|
<success>true</success> |
||||
|
<label>true</label> |
||||
|
<code>true</code> |
||||
|
<message>true</message> |
||||
|
<threadName>true</threadName> |
||||
|
<dataType>true</dataType> |
||||
|
<encoding>false</encoding> |
||||
|
<assertions>true</assertions> |
||||
|
<subresults>true</subresults> |
||||
|
<responseData>false</responseData> |
||||
|
<samplerData>false</samplerData> |
||||
|
<xml>false</xml> |
||||
|
<fieldNames>true</fieldNames> |
||||
|
<responseHeaders>false</responseHeaders> |
||||
|
<requestHeaders>false</requestHeaders> |
||||
|
<responseDataOnError>false</responseDataOnError> |
||||
|
<saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage> |
||||
|
<assertionsResultsToSave>0</assertionsResultsToSave> |
||||
|
<bytes>true</bytes> |
||||
|
<sentBytes>true</sentBytes> |
||||
|
<url>true</url> |
||||
|
<threadCounts>true</threadCounts> |
||||
|
<idleTime>true</idleTime> |
||||
|
<connectTime>true</connectTime> |
||||
|
</value> |
||||
|
</objProp> |
||||
|
<stringProp name="filename"></stringProp> |
||||
|
</ResultCollector> |
||||
|
<hashTree/> |
||||
|
<HeaderManager guiclass="HeaderPanel" testclass="HeaderManager" testname="HTTP Header Manager" enabled="true"> |
||||
|
<collectionProp name="HeaderManager.headers"> |
||||
|
<elementProp name="" elementType="Header"> |
||||
|
<stringProp name="Header.name">Content-Type</stringProp> |
||||
|
<stringProp name="Header.value">application/json</stringProp> |
||||
|
</elementProp> |
||||
|
</collectionProp> |
||||
|
</HeaderManager> |
||||
|
<hashTree/> |
||||
|
</hashTree> |
||||
|
</hashTree> |
||||
|
</jmeterTestPlan> |
||||
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 16 KiB |
Loading…
Reference in new issue