Вызов метода веб-API из концентратора сигналов - PullRequest
2 голосов
/ 02 марта 2020

У меня есть приложение 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(...);
      }

Может ли это сработать?

...