后方法不起作用 Angular 7 和 asp .net 核心 2.1



我正在尝试将请求从Angular 7发布到.NET Core 2.1中的REST API 我的拦截器是

import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpResponse, HttpHandler, HttpEvent, HttpErrorResponse } from '@angular/common/http';
import { Observable, throwError } from 'rxjs';
import { map, catchError } from 'rxjs/operators';
@Injectable()
export class HttpConfigInterceptor implements HttpInterceptor {
constructor() { }
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
request = request.clone({
withCredentials: true,
});
return next.handle(request).pipe(
map((event: HttpEvent<any>) => {
if (event instanceof HttpResponse) 
{
localStorage.setItem('status','200');
}
return event;
}),
catchError((error: HttpErrorResponse) => {
let data = {};
data = {
reason: error && error.error && error.error.message ? error.error.message : '',
//status: error.status
};
if (data['reason'].length>0){
alert("Error:"+ data['reason']);
}
else{
alert("Error :"+ error.message);
}
return throwError(error);
}));
}
}

我的初创公司.cs配置服务和配置方法如下

public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.AddAuthentication(IISDefaults.AuthenticationScheme);
//Get the configuration settings
services.Configure<AppSettings>(Configuration.GetSection("URLSettings"));
String[] origins = Configuration.GetSection("AllowedURLs").Get<AppSettings>().origins;
//Add the services
services.AddTransient<IClaimsTransformation, ClaimsTransformationService>();
//Add Cors
//services.AddCors();
services.AddCors(options =>
{
options.AddPolicy("CorsPolicy",
builder => builder
.AllowAnyHeader()
.AllowAnyMethod()
.WithOrigins(origins)
.AllowCredentials()
);
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseCors("CorsPolicy");
//app.UseAuthentication();
//app.UseHttpsRedirection();
app.UseMvc();
}

我在 Angular 中的 POST 方法是

public GenerateCarModels(carIds: number[]) :any {
const body = carIds;
let httpOptions= { headers: new HttpHeaders({ 'Content-Type': 'application/json'})};
const url = `${baseURL}${'/api/GenerateModels/GenerateCarModels'}`;
return this.http.post(url,body,httpOptions);
}

GET方法可以查找拦截器或API没有问题,但是当我尝试发布我得到的值时

Access to XMLHttpRequest at 'http://localhost:53499//api/reports/GenerateCarModels' from origin 'http://localhost:4200' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. 
Failed to load resource: the server responded with a status of 401 (Unauthorized)

我不确定我在这里做错了什么

我的哀悼...

"dependencies": {
"@angular/animations": "~7.2.0",
"@angular/common": "~7.2.0",
"@angular/compiler": "~7.2.0",
"@angular/core": "~7.2.0",
"@angular/forms": "~7.2.0",
"@angular/platform-browser": "~7.2.0",
"@angular/platform-browser-dynamic": "~7.2.0",
"@angular/router": "~7.2.0",
....
....
....
}

你能帮忙指出我在标题或其他任何东西中缺少什么吗?我已经在原点中允许 localhost:4200,正如我所说,其他 GET 方法工作正常。 谢谢

编辑:当我在后台运行Fiddler捕获数据时,它可以工作。

试试这个看看它是否有效

public void ConfigureServices(IServiceCollection services)
{
services.AddCors();
services.AddMvc();
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
app.UseCors(
options => options.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader()
);
app.UseMvc();
}

记住中间件顺序很重要

你试过这样的吗

changepassword(loginData: any): Observable<any> {
return this.http.post<any>('Usermaster/ChangePassword', loginData).pipe(
tap(
function (data) {
return data;
}
)
);

}

这是我正在使用的样本

确保在您的 cors 配置中使用类似options.WithOrigins("http://localhost:4200")而不是options.WithOrigins("http://localhost:4200/"),如果有,请删除 url 末尾的"/"。

然后尝试将解决方案与此链接集成,以便在 .NET Core Web API 上为 CORS 启用OPTIONS标头

https://stackoverflow.com/a/42199758/10158551

最新更新