Я немного застрял здесь, и мне явно нужна помощь.
Это мой c# бэкэнд:
public async Task<IActionResult> AddAttachmentAsync(IFormFile formFile, int id)
{
// Stuff is going on...
}
Это отлично работает в интерфейсе Swagger, но когда я генерирую машинописный клиент с nswag, я получаю следующее:
/**
* @param minutesId (optional)
* @param body (optional)
* @return Success
*/
addAttachment(id: number | undefined, body: Blob | undefined): Observable<string> {
let url_ = this.baseUrl + "/api/services/app/Attachment/AddAttachment?";
if (id === null)
throw new Error("The parameter 'id' cannot be null.");
else if (id !== undefined)
url_ += "id=" + encodeURIComponent("" + id) + "&";
url_ = url_.replace(/[?&]$/, "");
const content_ = body;
let options_ : any = {
body: content_,
observe: "response",
responseType: "blob",
headers: new HttpHeaders({
"Content-Type": "multipart/form-data",
"Accept": "text/plain"
})
};
return this.http.request("post", url_, options_).pipe(_observableMergeMap((response_ : any) => {
return this.processAddAttachment(response_);
})).pipe(_observableCatch((response_: any) => {
if (response_ instanceof HttpResponseBase) {
try {
return this.processAddAttachment(<any>response_);
} catch (e) {
return <Observable<string>><any>_observableThrow(e);
}
} else
return <Observable<string>><any>_observableThrow(response_);
}));
}
IFormFile становится BLOB-объектом, и я пытался создать BLOB-объект несколькими способами, но при попадании в бэкэнд параметр formFile имеет значение null.
Может кто-нибудь подсказать мне, как это сделать?
ОБНОВЛЕНИЕ:
Я обнаружил, что это может быть связано с тем, что nswag генерирует клиента или меня, используя неправильные декораторы.
Если я редактирую свои автоматически созданные сервисные прокси .ts файл к этому:
addAttachment(id: number | undefined, body: **FormData** | undefined): Observable<string> {
let url_ = this.baseUrl + "/api/services/app/Attachment/AddAttachment?";
if (id === null)
throw new Error("The parameter 'id' cannot be null.");
else if (id !== undefined)
url_ += "id=" + encodeURIComponent("" + id) + "&";
url_ = url_.replace(/[?&]$/, "");
const content_ = body;
let options_ : any = {
body: content_,
observe: "response",
responseType: "blob",
headers: new HttpHeaders({
**// Removed "Content-Type": "multipart/form-data",**
"Accept": "text/plain"
})
};
Затем я вызвал метод следующим образом:
myUploader(event): void {
for (let i = 0; i < event.files.length; i++) {
var formData = new FormData();
formData.append('formFile', event.files[i], event.files[i].name);
this._attachmentService.addAttachment(this.id, formData).subscribe(result => {
console.log(result);
})
}
}
NOTE , что я изменил тип Blob на FormData в сервисе прокси-файл и удалил Content-Header, а также. Также обратите внимание, что в formData.Append я назвал свойство так же, как свойство на стороне c#. если это не сделано, это не работает.
Не думаю, что это правильное решение, потому что мне пришлось вручную редактировать файл services-proxies, то есть я должен делать это каждый раз, когда запускаю refre sh .bat в nswag.
Я пытался реализовать класс OperationFilter, потому что это работало для меня в более ранней версии Swagger (до 5.0.0-rc4), однако мне не удалось заставить его работать с новейшей версией Swagger.
Кто-нибудь из вас, гиков, наш там, нашел лучшее решение?