在asp.netASP.NET核心mvc web应用程序中使用www.example.com核心web API

5us2dqdw  于 2023-01-14  发布在  .NET
关注(0)|答案(2)|浏览(182)

我试图在我的asp.net core mvc web应用程序中使用我的www.example.com web api,它们在同一个解决方案中。我配置了多项目启动的解决方案,它们同时启动了两个。asp.net web api in my asp.net core mvc web app which are on the same solution. I configured the solution for multi-project start and they start both.
接下来,我尝试使用Web部件中的API,但遇到以下错误。
无效操作异常:找不到类型"ProjectName. Web. Services. Interfaces. IAdminService"的合适构造函数。请确保该类型是具体的,并且公共构造函数的所有参数都已注册为服务或作为参数传递。还要确保未提供无关参数。Microsoft. Extensions. DependencyInjection. ActivatorUtilities. FindApplicationConstructor(类型示例类型,类型[]参数类型,输出构造函数信息匹配构造函数,输出可空值[]匹配参数Map)
以下是完整的堆栈跟踪

  • 项目结构如下 *

解决方案名称:
Name.API
Name.Web
每一个都具有其自身的相应结构
这是我的助手类

public static class HttpClientExtensions
    {
        public static async Task<T> ReadContentAsync<T>(this HttpResponseMessage response)
        {
            //if (response.IsSuccessStatusCode == false) return StatusCodes =  300;
                //throw new ApplicationException($"Something went wrong calling the API: {response.ReasonPhrase}");
                
            var dataAsString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

            var result = JsonSerializer.Deserialize<T>(
                dataAsString, new JsonSerializerOptions
                {
                    PropertyNameCaseInsensitive = true
                });

            return result;
        }
    }
    • IAdmin接口**
Task<IEnumerable<Admins>> GetAllAdmins();
    • AdminService(实现)**
private readonly HttpClient _client;
        public const string BasePath = "api/Admins";

        public AdminService(HttpClient client)
        {
            _client = client; // ?? throw new ArgumentNullException(nameof(client));
        }

        public async Task<IEnumerable<Admins>> GetAllAdmins()
        {
            var response = await _client.GetAsync(BasePath);

            return await response.ReadContentAsync<List<Admins>>();
        }
    • 管理控制器**
private readonly IAdminService _adminService;

        public AdminController(IAdminService adminService)
        {
            _adminService = adminService;
        }

        public async Task<IActionResult> Index()
        {
            var adminsList = await _adminService.GetAllAdmins();

            if(adminsList == null)
            {
                return new JsonResult("There are now Admins");
            }

            return View(adminsList);
        }
    • 程序. cs**
builder.Services.AddControllersWithViews();

builder.Services.AddHttpClient<IAdminService, IAdminService>(c =>
c.BaseAddress = new Uri("https://localhost:<port-Num>/"));

var app = builder.Build();

我做错了什么???我使用的是.NET 6,而且两个项目都在同一个解决方案中

    • NB**我的端点工作正常,我使用Postman测试了它们。
hyrbngr7

hyrbngr71#

操作失败,因为DI无法使用参数化构造函数示例化AdminService。这可能与Combining DI with constructor parameters?重复。
本质上,你应该尽可能的避免参数化构造函数注入,或者通过配置来控制它,或者通过公共的基础设施(比如host configuration)来加载配置。

brc7rcf0

brc7rcf02#

根据您的代码,我发现您在AddHttpClient方法中放置了两个接口,这导致了这个问题。
我建议你可以这样修改一下,这样就可以很好地工作了。

builder.Services.AddHttpClient<IAdminService, AdminService>(c =>
c.BaseAddress = new Uri("https://localhost:3333/"));

相关问题