Asyn c Задача для TryInvokeMember (DynamicObject) - PullRequest
0 голосов
/ 04 августа 2020

Я использую 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);
        }```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...