У меня есть приложение Angular (Angular 9) в качестве клиента и ASP. NET WebApi в качестве сервера. Сервер имеет дополнительный интерфейс Signalr2. Во-первых, я не знаю, поддерживает ли сервер, на котором будет установлено мое приложение, веб-сокеты. Если нет, то мое приложение angular создаст запрос http к WEB API и получит ответ asynchrounus, то есть обычный REST. Если сервер поддерживает веб-сокеты, я хотел бы сделать запрос веб-сокета со стороны моего клиента и получить ответ от signalR. Клиентская сторона понятна, я бы сделал какую-то абстракцию HTTPClient, чтобы сгенерировать одну или другую и дождаться ответа. Другое дело, как я могу вызвать метод Web APi из моего SignalRHub без использования. Net HttpClient? И если мне нужно использовать HttpClient, накладные расходы настолько велики, что выполнение обычного http-запроса приведет к тому же результату?
Это могут быть мои данные SignalR:
public WebApiRequest{
public string HttpMethod{ get; set;}
public string Route{ get; set;}
public OrderedDictionary<string, object> Parameters{ get; set;}
public string Content{ get; set;}
}
И это данные ответа SignalR:
public WebApiResponse{
public int StatusCode{ get; set;}
public object Data{ get; set;}
}
Это тестовый веб-контроллер Api:
[RoutePrefix("api/test")]
[Authorize]
public class TestController : ApiController
{
[HttpPost]
[Route("calculate")]
public async Task<IHttpActionResult> Calculate(int id, Calculatedata calc)
{
return Ok(CalculateMyTestData(id, calc));
}
}
Теперь с данными из запроса сигнализатора я хотел бы вызвать метод «Рассчитать» 'TestController' и верните ответ как WebApiResponse.
Идея, это внутри моего хаба:
public void DoWebApirequest(WebApiRequest data)
{
var test = new TestController()
{
var method = GetHttpMethod(data.HttpMethod);
Request = new HttpRequestMessage(method , this.Context.Request.Url)
{
Content = new StringContent(data.Content, Encoding.UTF8, "application/json")
}
};
foreach (var contextHeader in this.Context.Headers)
{
test.Request.Headers.Add(contextHeader.Key, contextHeader.Value);
}
// Now fill the parameters and call the method you like by reflection...
test.Calculate(...);
}
Может ли это сработать?