Azure Function调用.NET Core API遇依赖注入及响应异常求助
问题分析与解决方案
1. 构造函数注入ContactsController失败的原因
ASP.NET Core控制器由MVC框架负责实例化管理,默认依赖注入容器不会自动注册控制器类型,直接在Azure Function中注入ContactsController必然触发服务解析失败的错误。此外,直接调用控制器方法会跳过MVC请求处理管道(如模型验证、过滤器执行等),违背分层架构设计原则。
正确做法:将API中的业务逻辑提取到独立服务类,在API控制器和Azure Function中统一注入该服务接口:
步骤1:提取业务服务
// 共享服务接口 public interface IContactService { Task<List<Contact>> GetContacts(); } // 服务实现 public class ContactService : IContactService { public async Task<List<Contact>> GetContacts() { // 原ContactsController.GetContacts中的业务逻辑 return await FetchContactsFromDataSource(); } }
步骤2:API项目中注册服务并修改控制器
// API项目Program.cs builder.Services.AddScoped<IContactService, ContactService>(); // 修改ContactsController public class ContactsController : ControllerBase { private readonly IContactService _contactService; public ContactsController(IContactService contactService) { _contactService = contactService; } [HttpGet] public async Task<IActionResult> GetContacts() { var contacts = await _contactService.GetContacts(); return Ok(contacts); } }
步骤3:Azure Function中注册并注入服务
// Function项目Program.cs var host = new HostBuilder() .ConfigureFunctionsWorkerDefaults() .ConfigureServices(services => { services.AddScoped<IContactService, ContactService>(); }) .Build(); host.Run(); // 修改Function1 public class Function1 { private readonly IContactService _contactService; public Function1(IContactService contactService) { _contactService = contactService; } [FunctionName("Function1")] public async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log) { var contacts = await _contactService.GetContacts(); return new OkObjectResult(contacts); } }
2. IHttpClientFactory调用返回HttpResponseMessage.ToString()的问题
当前代码直接返回response.ToString(),仅能得到HttpResponseMessage对象的字符串描述,而非API返回的实际业务数据。需要读取响应内容流:
修改后的Function代码
namespace FunctionApp1 { public class Function1 { private readonly IHttpClientFactory _httpClientFactory; public Function1(IHttpClientFactory httpClientFactory) { this._httpClientFactory = httpClientFactory; } [FunctionName("Function1")] public async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req, ILogger log) { var client = _httpClientFactory.CreateClient(); var response = await client.GetAsync("https://localhost:7209/api/Contacts"); // 确保请求成功,非2xx状态码会抛出异常 response.EnsureSuccessStatusCode(); // 方式1:读取原始JSON字符串返回 var contactsJson = await response.Content.ReadAsStringAsync(); return new OkObjectResult(contactsJson); // 方式2:反序列化为对象后返回(需引入System.Net.Http.Json包) // var contacts = await response.Content.ReadFromJsonAsync<List<Contact>>(); // return new OkObjectResult(contacts); } } }
关键说明
response.EnsureSuccessStatusCode():在响应状态码非2xx时抛出异常,便于捕获请求失败场景。ReadAsStringAsync():读取响应内容为原始JSON字符串,适合直接返回。ReadFromJsonAsync<T>():将响应内容直接反序列化为指定类型对象,适用于后续业务逻辑处理。
内容的提问来源于stack exchange,提问作者rrrrTTTyyy
相关产品推荐
相关产品推荐

