【问题标题】:Post Method not working Angular 7 and asp .net core 2.1Post 方法不起作用 Angular 7 和 asp .net core 2.1
【发布时间】:2020-02-02 08:55:05
【问题描述】:

我正在尝试将来自 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);
            }));
    }
}

我的StartUp.cs的ConfigurationService和Configure方法如下

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 没有问题,但是当我尝试 POST 得到的值时

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 时,它可以捕获数据。

【问题讨论】:

  • 你能显示 appsettings.json 吗?
  • 嗨@levent { ' "Logging": { "LogLevel": { "Default": "Warning" } }, "AllowedHosts": "*", "AppSettings": { "origins": [ "localhost:4200"] } }' 这是我的 appSettings.json
  • 你调试过 ConfigureServices 方法来检查 origins 变量吗?您的配置键 "AllowedHosts" 但您尝试使用 "AllowedURLs" 读取。
  • @levent .. 感谢您发现它,但我使用“origins”和“withOrigins”一起驱动,AllowedHosts .. 可以删除。更改为匿名并为 POST 方法包含一个“内容类型”。我认为您在标题中至少需要其中一个并且它有效。 (不幸的是,我想发布答案,但由于某种原因 Stackoverflow 不允许我发布答案,我之前没有回答任何问题)

标签: javascript c# angular typescript asp.net-core


【解决方案1】:

你有没有这样尝试过

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

}

这是我正在使用的示例

【讨论】:

  • 嗨@ShivShankar,对不起,它没有用。它总是返回未经授权,访问 [链接] (localhost:53499//api/GenerateModels/GenerateCarModels') 的 XMLHttpRequest 来自原点'localhost:4200' 已被 CORS 策略阻止:对预检请求的响应未通过访问控制检查:否 'Access-Control-Allow -Origin' 标头存在于请求的资源上。被扔回
  • 您的出身和每个想法都是正确的,您的数据绑定或数据映射问题存在一些问题,来自您的角度和 api 都具有相同的模型类,或者您传递的数据是准确的,并检查您的 url localhost:1233/api/Analytics 你有双 // 并且首先与邮递员检查样本数据是你的 api 是从那里调用的
  • @shiwShankar [HttpPost("GenerateCarModels")] public IActionResult GenerateCarModels([FromBody] int[] carIds) { return Ok(new { Message = "OK" }); } 这是 .NET CORE 中的 POST 方法,它接收来自 angular 的 API 调用(抱歉,abt 格式..)
【解决方案2】:

试试这个看看是否有效

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();
}

记住中间件顺序很重要

【讨论】:

  • 嗨@Tony,我必须添加 ..AllowCredentials() 因为我正在使用Credentials:true 但很抱歉它不起作用。我收到与上面回复的相同的错误消息。但是,当我使用 Fiddler 捕获流量时它起作用的事实表明我缺少一些标题信息或一些我无法选择的明显信息。
  • 大家好,过了一会儿,我在 [link] codeproject.com/Answers/5162648/… 找到了解决方案,感谢原作者。我将launchSettings更改为其中提到的内容并且它有效。我不必使用那里提到的中间件部分或对 Angular 端的标题进行任何更改。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-08-15
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 2019-04-03
    • 2023-03-14
    • 1970-01-01
    • 2021-07-25
    • 1970-01-01
    相关资源
    最近更新 更多