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)
我有一个 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)
归档时间: |
|
查看次数: |
7630 次 |
最近记录: |