.net 通过Azure函数调用API

v09wglhw  于 2022-12-20  发布在  .NET
关注(0)|答案(1)|浏览(169)

我正在尝试调用Azure HTTP触发器内的API。我有一个需要从Azure函数调用的.NET核心API。该API工作正常。当我尝试实现触发器时,收到此错误。Microsoft.Extensions.DependencyInjection.Abstractions: Unable to resolve service for type 'WebApplication1.Controllers.ContactsController' while attempting to activate 'FunctionApp1.Function1'.
.NET核心API和Azure功能位于同一解决方案中,但属于不同的项目。
这是触发器的实现

namespace FunctionApp1
{
    public class Function1
    {
        private readonly ContactsController _contacts;

        public Function1(ContactsController _contacts)
        {
            this._contacts = _contacts;
        }

        [FunctionName("Function1")]
        public async Task<IActionResult> Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", Route = null)] HttpRequest req,
            ILogger log)
        {
            var response = await _contacts.GetContacts();

            return new OkObjectResult(response);
        }
    }
}

告诉我这有什么问题。谢谢。

siotufzp

siotufzp1#

控制器不是客户端,它属于API项目,尽管声明为public,但在API项目之外没有任何意义(以及可能需要示例化控制器以对其进行测试的单元测试项目,但这与这个问题无关)。要调用API,您需要一个HttpClient,它可以向所需API操作的URL发出Web请求。
你得到的错误是告诉你Functions宿主没有足够的信息来创建构造函数依赖项的示例,在你的例子ContractsController中,这对你来说没有用,你实际需要的是一个IHttpClientFactory

public Function1(IHttpClientFactory httpClientFactory)
        {
            this._httpClientFactory = httpClientFactory;
        }

并使用此命令创建一个客户端来发出请求:

var client = this._httpClientFactory.CreateClient();
var response = await client.GetAsync(...your URL);

仍然需要配置主机以注入HttpClientFactory,因此如果您还没有startup类,请在函数应用中定义一个startup类:

[assembly: FunctionsStartup(typeof(Startup))]

public class Startup : FunctionsStartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {
        builder.Services.AddHttpClient();
    }
}

.AddHttpClient();是Microsoft.Extensions.Http提供的帮助器方法,用于配置依赖注入逻辑,以便主机知道如何注入HttpClients,有关完整说明,请参见documentation

相关问题