Azure Function Custom Class 请求正文 - 无参数 constructor/Invalid Cast string -> guid

Azure Function Custom Class request body - No Parameter-less constructor/Invalid Cast string -> guid

我有一个看起来像这样的 azure 函数:

    [FunctionName("AddMaterial")]
    public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]AddMaterialCommand command, 
        ILogger log, [Inject(typeof(IMediator))]IMediator mediator)
    {
        log.LogInformation("AddMaterial Function is processing a request");

        var events = await mediator.Send(command);
        if (events != null)
        {
            await mediator.Publish(events);
            return (ActionResult)new OkObjectResult(events);
        }
        return new BadRequestObjectResult(new { message = "Please check that WarehouseId, RollPoNumber, RollNumber, Location and RollWeight are included in request" });
    }

此函数使用自定义对象 AddMaterialCommand 作为每个 the docs 的请求。

自定义对象 class 看起来像这样:

{
    [DataContract]
    public class AddMaterialCommand : IRequest<EventList>
    {
        [DataMember]
        public Guid WarehouseId { get; set; } 
        [DataMember]
        public int RollPoNumber { get; set; }
        [DataMember]
        public DateTime? DateRecieved { get; set; }

        public AddMaterialCommand(Guid warehouseId, int rollPoNumber,  DateTime dateRecieved)
        {
            WarehouseId = warehouseId;
            RollPoNumber = rollPoNumber;
            Location = location;
            DateRecieved = dateRecieved;
        }
}

当发布到函数时它抛出这个错误:

Executed 'AddMaterial' (Failed, Id=d7322061-c972-4e93-83cd-4d0313d26e86) [9/12/2018 8:59:46 PM] System.Private.CoreLib: Exception while executing function: AddMaterial. Microsoft.Azure.WebJobs.Host: Exception binding parameter 'command'. System.Private.CoreLib: No parameterless constructor defined for this object.

当我添加无参数构造函数时(为什么我需要这样做?),然后它失败并出现此错误:

Executed 'AddMaterial' (Failed, Id=973cd363-19d6-49a3-a2eb-759f30c284bb) [9/12/2018 9:01:27 PM] System.Private.CoreLib: Exception while executing function: AddMaterial. Microsoft.Azure.WebJobs.Host: Exception binding parameter 'command'. System.Private.CoreLib: Invalid cast from 'System.String' to 'System.Guid'.

这是怎么回事?

我最好的猜测是请求的主体没有被读取,并且一个空值正在抛出无效的转换异常。我仍然不知道为什么我需要一个无参数的构造函数。当我使用 [FromBody] 绑定时,在转向 azure 函数之前我没有遇到这个问题,但我认为我不能将该绑定与 azure 函数一起使用。

我最终只是将自定义 class 替换为 httpRequestMessage 并在函数中创建命令,就像这样

dynamic command = await req.Content.ReadAsAsync<AddMaterialCommand>();

仍然希望只使用自定义 class 作为函数的参数,但是哦,好吧。