我试图在我的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测试了它们。
2条答案
按热度按时间hyrbngr71#
操作失败,因为DI无法使用参数化构造函数示例化AdminService。这可能与Combining DI with constructor parameters?重复。
本质上,你应该尽可能的避免参数化构造函数注入,或者通过配置来控制它,或者通过公共的基础设施(比如host configuration)来加载配置。
brc7rcf02#
根据您的代码,我发现您在AddHttpClient方法中放置了两个接口,这导致了这个问题。
我建议你可以这样修改一下,这样就可以很好地工作了。