Request.Form.Files' 在 asp.net core 2.2 中引发了类型为 'system.invalidoperationexception' 的异常,内容类型为 'application-json' 不正确

Jas*_*uma 5 asp.net-core angular8

我正在使用带有 Angular 8 的 asp.net core 2.2。我正在尝试上传文件,其中包含一些要使用 post 方法保存的数据。数据正在传递到控制器,但在控制器中 Request.Form 对象抛出错误。

它在带有 Angular 2 的 asp.core 2.0 中正常工作。但我正在尝试使用 asp.net core 2.2 将此项目更新为 Angular 8。现在我收到此错误“Request.form.files”引发了“system.invalidoperationexception”类型的异常。

角度服务代码:

        saveNewMail(user: CommunicationActivityModel, files: File[]) {
        let body = JSON.stringify(user);
        let formData = new FormData();
        for (var i = 0; i < files.length; i++) {
          formData.append('uploadedFiles', files[i]);
        }
         formData.append('user', body);

         let requestedUrl = this.baseUrl + 'SaveNewMail';

         return this.apiService.postFormData(requestedUrl, 
         formData).pipe(map(response => response));

   }
Run Code Online (Sandbox Code Playgroud)

api.service代码:

 postFormData(path: string, body: FormData): Observable<any> {
    return this.http.post(
      `${environment.api_url}${path}`,
       body
     ).pipe(catchError(this.formatErrors));
  }
Run Code Online (Sandbox Code Playgroud)

控制器代码:

        [HttpPost]
        [Route("SaveNewMail")]
        public IActionResult SaveMail()
       {
            var files = Request.Form.Files;
            var communicationActivityString = Request.Form["user"];
            var communicationActivity = 
    JsonConvert.DeserializeObject<CommunicationActivityViewModel> 
   (communicationActivityString);
            var activityId = 
    _messageCenterService.SaveNewMail(communicationActivity, files);
                return Ok(activityId);
            }
Run Code Online (Sandbox Code Playgroud)

Jas*_*uma 4

我有一个 HttpTokenInterceptor 类,它为每个 Http 请求添加了以下配置。

 headersConfig = {
    'Content-Type': 'application/json',
    'Accept': 'application/json'
  };
Run Code Online (Sandbox Code Playgroud)

但对于Request.Form.Files,你必须跳过这个json配置。所以我创建了一个自定义元数据类。

export class InterceptorMetaOptions {
  constructor(
    public skipIncerceptor: boolean = false,
    public skipJson: boolean = false,
    public skipAuthorization: boolean = false
  ) { }
}
Run Code Online (Sandbox Code Playgroud)

并在http请求中传递它。

saveNewMail(user: CommunicationActivityModel, files: File[]) {

let body = JSON.stringify(user);
let formData = new FormData();
for (var i = 0; i < files.length; i++) {
  formData.append('uploadedFiles', files[i]);
}
formData.append('user', body);

let requestedUrl = this.baseUrl + 'SaveNewMail';

let options = {
  headers: {
    meta: [new InterceptorMetaOptions(false, true, false)]
  }
};

return this.apiService.postFormData(requestedUrl, formData, options).pipe(map(response => response));
Run Code Online (Sandbox Code Playgroud)

}

并在 HttpTokenInterceptor 类中检查它以跳过 json 配置。

intercept(request: HttpRequest<any>, next: HttpHandler): 
Observable<HttpEvent<any>> {

var customMetaOption = this.getMeta(request);

if (customMetaOption) {
  console.log("Custom Meta Applied");
  console.log(customMetaOption);
}

let headersConfig = {};

if (!customMetaOption || !customMetaOption.skipJson) {
  headersConfig = {
    'Content-Type': 'application/json',
    'Accept': 'application/json'
  };
}


const req = request.clone({ setHeaders: headersConfig });
Run Code Online (Sandbox Code Playgroud)