.net - 通过 Azure Function 调用 API

标签 .net azure azure-functions

我正在尝试调用 Azure HTTP 触发器内的 API。我有一个 .NET Core API,需要从 Azure 函数调用。 API 工作正常,没有任何问题。当我尝试实现触发器时,我收到此错误。 Microsoft.Extensions.DependencyInjection.Abstractions:尝试激活“FunctionApp1.Function1”时无法解析类型“WebApplication1.Controllers.ContactsController”的服务。

.NET core 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);
        }
    }
}

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

我尝试了这个建议

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");

            return new OkObjectResult(response.ToString());
        }
    }
}

但现在我得到了一些回应,但不是我想要的回应

{
    "version": "1.1",
    "content": {
        "headers": [
            {
                "key": "Content-Type",
                "value": [
                    "application/json; charset=utf-8"
                ]
            }
        ]
    },
    "statusCode": 200,
    "reasonPhrase": "OK",
    "headers": [
        {
            "key": "Date",
            "value": [
                "Mon, 19 Dec 2022 18:59:13 GMT"
            ]
        },
        {
            "key": "Server",
            "value": [
                "Kestrel"
            ]
        },
        {
            "key": "Transfer-Encoding",
            "value": [
                "chunked"
            ]
        }
    ],
    "trailingHeaders": [],
    "requestMessage": {
        "version": "1.1",
        "versionPolicy": 0,
        "content": null,
        "method": {
            "method": "GET"
        },
        "requestUri": "https://localhost:7209/api/Contacts",
        "headers": [],
        "properties": {},
        "options": {}
    },
    "isSuccessStatusCode": true
}

最佳答案

这不是调用 Web API 的方式。 Controller 不是客户端,它属于 API 项目,虽然被声明为 public,但在 API 项目之外没有任何意义(也许是一个需要实例化 Controller 来测试的单元测试项目)它,但这与这个问题无关)。要调用 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);
var returnResult = await response.Content.ReadAsAsync<Whatever your return type is>();

主机仍需要配置为注入(inject) HttpClientFactory,因此如果您还没有启动类,请在函数应用中定义一个启动类:

[assembly: FunctionsStartup(typeof(Startup))]

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

.AddHttpClient(); 是 Microsoft.Extensions.Http 提供的辅助方法,用于配置宿主机的依赖注入(inject)逻辑,以了解如何注入(inject) HttpClients,请参阅 documentation以获得完整的解释。

关于.net - 通过 Azure Function 调用 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74853850/

相关文章:

c# - 基于输入数据的自定义返回类型

c# - 调用 Microsoft.Owin.Cors 后无法加载 System.Web.Cors 程序集

azure - 部署到新的 D 系列 Azure VM

Azure Function 加载错误的程序集?

azure - 使用Azure Function .NET 5,如何下载数据?

c# - HTML Agility Pack - 只能从文件系统加载 xml 文档,不能从 Web

c# - 使用 Mono.Cecil 导入方法

azure - TinyIOC 未在使用 Azure 模拟器的不同调试运行、Web api 项目上注册相同类型

django - 无法让 sql server 与 django azure web 应用程序一起使用

azure - CosmosDB触发器 : Object reference not set to an instance of an object