从 angular 前端路由到 asp.net 核心 3.1 后端
Routing from an angular front end to an asp.net core 3.1 backend
So here is my backend .csproj. Im doing a front end spa in angular connecting to my backend in memory database. I can connect to my database from the URL of my back end application like in the image. Also i can make postman requests and get postman sucessfull responses with this header... so far so good. in my front end there is a problem. i have my front end angular service package with the url i use in postman. in my component i call this method to connect to my service. 不知何故,我无法获得在邮递员中执行获取请求时获得的“旅行”列表。我几乎 80% 确定错误出在后端,因为我可以在其他后端应用程序中收到请求。所以我要把我的后端代码放在这里。
我的program.cs
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
using (var context = scope.ServiceProvider.GetService<AppDbContext>())
{
context.Database.EnsureCreated();
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
launchSettings.json
我的startup.cs
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMemoryCache();
services.AddControllers().ConfigureApiBehaviorOptions(options =>
{
});
services.AddDbContext<AppDbContext>(options =>
{
options.UseInMemoryDatabase(Configuration.GetConnectionString("memory"));
});
services.AddScoped<ITripRepository, TripRepository>();
services.AddScoped<ITripService, TripService>();
services.AddScoped<IUnitOfWork, UnitOfWork>();
services.AddAutoMapper(typeof(Startup));
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
我的控制器:
[HttpGet]
[ProducesResponseType(typeof(List<TripDTO>), 200)]
public async Task<IEnumerable<TripDTO>> GetAllAsync()
{
var trips = await _tripService.ListAsync();
var dtos = _mapper.Map<IEnumerable<Trip>, IEnumerable<TripDTO>>(trips);
return dtos;
}
编辑:
当我在我试图获得的列表中做前端 console.log 时得到的错误是这个 enter image description here
EDIT2:AppDbContext 后端
public class AppDbContext : DbContext
{
public DbSet<Trip> Trips { get; set; }
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Trip>().ToTable("Trips");
builder.Entity<Trip>().HasKey(p => p.Id);
builder.Entity<Trip>().Property(p => p.Id).IsRequired().ValueGeneratedOnAdd();
builder.Entity<Trip>().Property(p => p.Key).IsRequired().HasMaxLength(10);
builder.Entity<Trip>().Property(p => p.IsEmpty).IsRequired();
builder.Entity<Trip>().Property(p => p.Orientation).IsRequired();
builder.Entity<Trip>().Property(p => p.LineKey).IsRequired().HasMaxLength(10);
builder.Entity<Trip>().Property(p => p.PathKey).IsRequired().HasMaxLength(10);
builder.Entity<Trip>().Property(p => p.IsGenerated).IsRequired();
builder.Entity<Trip>().Property(p => p.PassingTimes)
.HasConversion(
v => JsonConvert.SerializeObject(v),
v => JsonConvert.DeserializeObject<List<PassingTime>>(v));
builder.Entity<Trip>().HasData
(
new Trip { Id = 100,Key="Trip:344",IsEmpty=false,Orientation=false,LineKey="Line:444",PathKey="Path:344",IsGenerated=true }, // Id set manually due to in-memory provider
new Trip { Id = 1200,Key="Trip:1344",IsEmpty=false,Orientation=false,LineKey="Line:2444",PathKey="Path:3424",IsGenerated=true }
);
}
}
}
编辑 3:
HTML
<!DOCTYPE html>
<html>
<body>
<h4>List of Trips</h4>
<div class="list row">
<div class="col-md-6">
<ul class="list-group">
<li class="list-group-item" *ngFor="let trip of trips; let i = index" [class.active]="i == currentIndex" (click)="setActiveTrip(trip, i)">
{{ trip.key }}
</li>
</ul>
</div>
<div *ngIf="!currentTrip">
<br />
<p>Please click on a trip to see the details...</p>
</div>
<div class="col-md-6">
<div *ngIf="currentTrip">
<h4>Selected Trip Details</h4>
<div>
<div>
<label><strong>Key:</strong></label> {{ currentTrip.key }}
</div>
</div>
</div>
</div>
</div>
</body>
</html>
component.cs
import { Component, OnInit } from '@angular/core';
import { TripService } from 'src/app/masterdataviagem/services/trip-service';
@Component({
selector: 'app-tripslist',
templateUrl: './tripslist.component.html',
styleUrls: ['./tripslist.component.css']
})
export class TripslistComponent implements OnInit {
trips: any;
currentTrip: any = null;
currentIndex = -1;
key = '';
tripsList:any;
constructor(private tripService:TripService) { this.tripsList=this.tripService.getAll()}
ngOnInit(): void {
this.retrieveTrips();
}
retrieveTrips() {
this.trips= this.tripService.getAll().subscribe(
data => {
this.trips = data;
console.log(data);
},
error => {
console.log(error);
});
console.log(this.trips);
}
refreshList() {
this.retrieveTrips();
this.currentTrip = null;
this.currentIndex = -1;
}
setActiveTrip(trip: any, index: number) {
this.currentTrip = trip;
this.currentIndex = index;
}
}
也许您必须在后端启用 CORS(我猜是浏览器控制台末尾的“未知错误”,那是您的console.log(错误))。
您可以尝试使用这个 chrome 扩展来测试:https://chrome.google.com/webstore/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf?hl=en.
如果您的后端响应显示启用了扩展,那么您必须启用 CORS:
https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1#ecors
So here is my backend .csproj. Im doing a front end spa in angular connecting to my backend in memory database. I can connect to my database from the URL of my back end application like in the image. Also i can make postman requests and get postman sucessfull responses with this header... so far so good. in my front end there is a problem. i have my front end angular service package with the url i use in postman. in my component i call this method to connect to my service. 不知何故,我无法获得在邮递员中执行获取请求时获得的“旅行”列表。我几乎 80% 确定错误出在后端,因为我可以在其他后端应用程序中收到请求。所以我要把我的后端代码放在这里。
我的program.cs
public class Program
{
public static void Main(string[] args)
{
var host = CreateHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
using (var context = scope.ServiceProvider.GetService<AppDbContext>())
{
context.Database.EnsureCreated();
}
host.Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}
launchSettings.json
我的startup.cs
public class Startup
{
public IConfiguration Configuration { get; }
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public void ConfigureServices(IServiceCollection services)
{
services.AddMemoryCache();
services.AddControllers().ConfigureApiBehaviorOptions(options =>
{
});
services.AddDbContext<AppDbContext>(options =>
{
options.UseInMemoryDatabase(Configuration.GetConnectionString("memory"));
});
services.AddScoped<ITripRepository, TripRepository>();
services.AddScoped<ITripService, TripService>();
services.AddScoped<IUnitOfWork, UnitOfWork>();
services.AddAutoMapper(typeof(Startup));
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
}
我的控制器:
[HttpGet]
[ProducesResponseType(typeof(List<TripDTO>), 200)]
public async Task<IEnumerable<TripDTO>> GetAllAsync()
{
var trips = await _tripService.ListAsync();
var dtos = _mapper.Map<IEnumerable<Trip>, IEnumerable<TripDTO>>(trips);
return dtos;
}
编辑: 当我在我试图获得的列表中做前端 console.log 时得到的错误是这个 enter image description here
EDIT2:AppDbContext 后端
public class AppDbContext : DbContext
{
public DbSet<Trip> Trips { get; set; }
public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<Trip>().ToTable("Trips");
builder.Entity<Trip>().HasKey(p => p.Id);
builder.Entity<Trip>().Property(p => p.Id).IsRequired().ValueGeneratedOnAdd();
builder.Entity<Trip>().Property(p => p.Key).IsRequired().HasMaxLength(10);
builder.Entity<Trip>().Property(p => p.IsEmpty).IsRequired();
builder.Entity<Trip>().Property(p => p.Orientation).IsRequired();
builder.Entity<Trip>().Property(p => p.LineKey).IsRequired().HasMaxLength(10);
builder.Entity<Trip>().Property(p => p.PathKey).IsRequired().HasMaxLength(10);
builder.Entity<Trip>().Property(p => p.IsGenerated).IsRequired();
builder.Entity<Trip>().Property(p => p.PassingTimes)
.HasConversion(
v => JsonConvert.SerializeObject(v),
v => JsonConvert.DeserializeObject<List<PassingTime>>(v));
builder.Entity<Trip>().HasData
(
new Trip { Id = 100,Key="Trip:344",IsEmpty=false,Orientation=false,LineKey="Line:444",PathKey="Path:344",IsGenerated=true }, // Id set manually due to in-memory provider
new Trip { Id = 1200,Key="Trip:1344",IsEmpty=false,Orientation=false,LineKey="Line:2444",PathKey="Path:3424",IsGenerated=true }
);
}
}
}
编辑 3:
HTML
<!DOCTYPE html>
<html>
<body>
<h4>List of Trips</h4>
<div class="list row">
<div class="col-md-6">
<ul class="list-group">
<li class="list-group-item" *ngFor="let trip of trips; let i = index" [class.active]="i == currentIndex" (click)="setActiveTrip(trip, i)">
{{ trip.key }}
</li>
</ul>
</div>
<div *ngIf="!currentTrip">
<br />
<p>Please click on a trip to see the details...</p>
</div>
<div class="col-md-6">
<div *ngIf="currentTrip">
<h4>Selected Trip Details</h4>
<div>
<div>
<label><strong>Key:</strong></label> {{ currentTrip.key }}
</div>
</div>
</div>
</div>
</div>
</body>
</html>
component.cs
import { Component, OnInit } from '@angular/core';
import { TripService } from 'src/app/masterdataviagem/services/trip-service';
@Component({
selector: 'app-tripslist',
templateUrl: './tripslist.component.html',
styleUrls: ['./tripslist.component.css']
})
export class TripslistComponent implements OnInit {
trips: any;
currentTrip: any = null;
currentIndex = -1;
key = '';
tripsList:any;
constructor(private tripService:TripService) { this.tripsList=this.tripService.getAll()}
ngOnInit(): void {
this.retrieveTrips();
}
retrieveTrips() {
this.trips= this.tripService.getAll().subscribe(
data => {
this.trips = data;
console.log(data);
},
error => {
console.log(error);
});
console.log(this.trips);
}
refreshList() {
this.retrieveTrips();
this.currentTrip = null;
this.currentIndex = -1;
}
setActiveTrip(trip: any, index: number) {
this.currentTrip = trip;
this.currentIndex = index;
}
}
也许您必须在后端启用 CORS(我猜是浏览器控制台末尾的“未知错误”,那是您的console.log(错误))。
您可以尝试使用这个 chrome 扩展来测试:https://chrome.google.com/webstore/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf?hl=en.
如果您的后端响应显示启用了扩展,那么您必须启用 CORS:
https://docs.microsoft.com/en-us/aspnet/core/security/cors?view=aspnetcore-3.1#ecors