如何从Azure函数返回AcceptedAtRouteResult?

时间:2019-04-01 11:13:51

标签: c# .net azure azure-functions .net-standard

从Azure函数返回AcceptedAtRouteResult时,我一直在处理主机错误。

我希望能够从Azure函数返回AcceptedAtRouteResult,以告知调用方任何省略的查询字符串参数的默认值,但我一直遇到未处理的主机错误。

我的目标是.net Standard 2.0.3并使用Microsoft.NET.Sdk.Functions 1.0.26

[FunctionName("AcceptedAtRouteResult")]
public static IActionResult AcceptedAtRouteResult(
    [HttpTrigger("GET")]HttpRequest req)
{
    // read query parameter if present else set to defualt value

   var rs = new AcceptedAtRouteResult(
        "acceptedatrouteresult", 
        new { someParameter = "value" }, 
        new { Result = "1" });

    return rs;
}

我不断遇到异常:

  

发生未处理的主机错误。 System.Private.CoreLib:索引   超出范围。必须为非负数,并且小于   采集。参数名称:索引。

1 个答案:

答案 0 :(得分:0)

产品小组建议使用以下类来替换AcceptedAtRouteResult返回类型,直到可以纠正错误为止。

class AcceptedObjectResult : ObjectResult
{
    private readonly string _location;

    public AcceptedObjectResult(string location, object value) : base(value)
    {
        _location = location;
    }

    public override Task ExecuteResultAsync(ActionContext context)
    {
        context.HttpContext.Response.StatusCode = 202;
        var uri = new UriBuilder(context.HttpContext.Request.Scheme, context.HttpContext.Request.Host.Host)
        {
            Path = $@"api/{_location}",
        };
        if (context.HttpContext.Request.Host.Port.HasValue)
        {
            uri.Port = context.HttpContext.Request.Host.Port.Value;
        }

        context.HttpContext.Response.Headers.Add(@"Location", uri.ToString());

        return base.ExecuteResultAsync(context);
    }
}

可以在Github上跟踪该故障单:https://github.com/Azure/azure-functions-host/issues/4267