приложение ASP NEt Core. Как запустить из фронтенда процесс в контроллере
Приложение ASP Net Core. Контроллер на c# + React. Надо по нажатию кнопки запустить ffmpeg'ский скрипт на контроллере.
Контроллер
<pre>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
using System.ComponentModel;
namespace WebConfigurator.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ScriptController : ControllerBase
{
string path = @"ffmpeg.exe";
string args = @"some args";
[HttpPost]
public void Post()
{
Process process = new Process();
process.StartInfo.FileName = path;
process.StartInfo.Arguments = args;
process.StartInfo.WindowStyle = ProcessWindowStyle.Maximized;
process.Start();
process.WaitForExit();
}
}
}
</pre>
Фрагмент из react
controller = new AbortController();
signal = this.controller.signal; // будет нужен для остановки
urlScriptController: string = '/api/Script';
isSignal: boolean = false; // флаг для корректной остановки
options: RequestInit = {
headers: {
'Accept': 'application/json',
'Content-type': 'application/json'
},
mode: 'cors',
cache: 'no-cache',
credentials: 'same-origin',
method: 'POST',
signal: this.signal,
redirect: 'follow',
referrerPolicy: 'no-referrer'
// body не нужен т.к. просто дёргаем метод в контроллере
};
runScript() {
fetch(this.urlScriptController, this.options
).then(response => {
console.log('FFMPEG response: ', response);
return response.json();
}).catch(err => {
console.log("Error Reading data FFMPEG" + err);
});
this.isSignal = true;
}
Потом кнопку нажимаем
<Button outline color="primary" onClick={this.runScript}>Go</Button>
В консоль возвращает response где:
> "...status: 200, ok: true"
т.е. вроде бы норм статус и отсутствие ошибок. А также:
> Unexpected end of JSON input"
Что делать, куда грести?
Ответы (1 шт):
Автор решения: Boris
→ Ссылка
В контроллере может быть только один метод post (т.е. там вроде бы можно обойти это правило, но в первом приближении именно так). Я же пытался на один контроллер повесить несколько методов из фронтенда. Пришлось на каждый fetch с method: 'POST' писать новый контроллер.