在本地调试Azure功能

时间:2019-03-08 13:04:36

标签: azure-functions

我在.Net标准2.0中具有功能:

from django.http.response import HttpResponse

import zipfile

def post(self, request)
    student_photo_url_1 = '%s/photo.jpg'
    archive = zipfile.ZipFile(request.FILES.get('files'), 'r')
    add_file(archive.open(self.student_photo_url_1 % 'student name'))
    file_instance = FileModel.objects.create(
        file=File(file.getvalue()),
        file_id='',
        file_meta=FileMeta.objects.get(name='Student Photo')
    )
    return HttpResponse('Ok')

根据本文:https://docs.microsoft.com/en-us/azure/azure-functions/functions-run-local部分“非HTTP触发的函数”

“对于除HTTP触发器和Webhooks以外的所有其他功能,您可以通过调用管理端点在本地测试您的功能。在本地服务器上使用HTTP POST请求调用此端点会触发该功能。您可以选择传递测试数据到POST请求正文中的执行。此功能类似于Azure门户中的“测试”选项卡。

您调用以下管理员端点来触发非HTTP功能:“

    [FunctionName("A_Test")]
    public static async Task<string> Test(ILogger log, ExecutionContext context)
    {
        log.LogInformation("test");
        return "hello";
    }

我应该能够使用以下方法测试非HTTP触发的功能:

 http://localhost:{port}/admin/functions/{function_name}

但是,当以调试方式运行时,我得到的只是一个400错误:

curl --request POST -H "Content-Type:application/json" --data '{}' http://localhost:7071/admin/functions/A_Test -v

为什么?

2 个答案:

答案 0 :(得分:0)

您的函数没有与之关联的任何触发器,这很可能未被标识为触发器。例如,您可以添加一个计时器触发器。

以下方法/技巧也可能适用:当我有一个非HTTP触发器并想在本地对其进行测试时,我会将实际逻辑提取到其自己的类中。然后,我打开一个单独的HTTP触发器,该触发器仅用于测试。

答案 1 :(得分:0)

这里的问题是,curl在POST请求的实际正文中包含来自--data '{}'的引号。

Azure函数期望这种身体:

{}

实际上,curl发送此消息:

'{}'

解决方案是不对--data参数使用引号,例如:

curl --request POST -H "Content-Type:application/json" --data {} http://localhost:7071/admin/functions/A_Test -v