Я использую Httpclient через TryInvokeMember. Проблема в том, что все вызовы httpclient выполняются asyn c.
- Я не могу вызвать на нем await, поскольку TryInvoke - это метод syn c.
- Когда Я использую .Result, я получаю ошибку: Компонент рендеринга необработанного исключения: не может ждать на мониторах в этой среде выполнения.
- Когда я пытаюсь установить результат задачи, я получаю ошибку приведения Folling Cast.
Невозможно неявно преобразовать тип System.Threading.Tasks.Task в System.Threading.Tasks.Task. > '
Я не могу вызвать PostRequest, так как t определяется во время выполнения.
Их можно как-то исправить?
HttpProxy:
using System.Dynamic;
using System.Linq;
using System.Reflection;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Routing;
using THop.Food.Client.Logic.Services;
namespace THop.Food.Client.Logic.Proxies
{
public class HttpProxy<T> : DynamicObject
{
private readonly IHttpClientService _httpClientService;
private readonly string _controllerName;
public HttpProxy(IHttpClientService httpClientService)
{
_httpClientService = httpClientService;
_controllerName = typeof(T).Name.Remove(0, 1).Replace("Controller", string.Empty);
}
public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
{
Console.WriteLine("Starting call");
var methods = typeof(T).GetMethods().Where(x => x.Name == binder.Name);
var method = methods.First(methodInfo => binder.CallInfo.ArgumentNames.All(arg => methodInfo.GetParameters().Any(x => x.Name == arg)));
var attribute = method.GetCustomAttribute(typeof(HttpMethodAttribute), true) as HttpMethodAttribute;
var route = attribute.Template ?? string.Empty;
var returnType = method.ReturnType.GenericTypeArguments.FirstOrDefault() ?? method.ReturnType;
Console.WriteLine("Routing");
while ((route.IndexOf('{') != -1))
{
var indexOfStart = route.IndexOf('{');
var indexofEnd = route.IndexOf('}');
var propertyName = route.Substring(indexOfStart + 1, indexofEnd - 1);
var param = method.GetParameters().First(x => x.Name == propertyName);
route = route.Replace($"{{{propertyName}}}", args[param.Position].ToString());
}
switch (attribute)
{
case HttpPostAttribute _:
{
var bodyParam = method.GetParameters().First(x => x.GetCustomAttribute<FromBodyAttribute>() != null);
var body = args[bodyParam.Position];
var res = _httpClientService.PostRequest(_controllerName, route, body, returnType);
result = res;
return true;
}
case HttpGetAttribute _:
var t = _httpClientService.GetRequest(_controllerName, route, returnType);
result = t;
return true;
default:
result = default;
return false;
}
}
}
}
HttpClientService
{
private readonly HttpClient _httpClient;
public HttpClientService(HttpClient httpClient)
{
_httpClient = httpClient;
}
public async Task<dynamic> GetRequest(string path, Type type)
{
var response = await _httpClient.GetAsync(path);
return await response.Content.ReadFromJsonAsync(type);
}
public async Task<dynamic> GetRequest(string controller, string parameter, Type type)
{
return await GetRequest($"{controller}/{parameter}", type);
}}
Вызывающий:
{
await base.OnInitializedAsync();
var ingredient = await IngredientsController.Get(Id);
Ingredient = Mapper.Map<EditIngredient>(ingredient);
}```