【问题标题】:How to return AcceptedAtRouteResult from an Azure function?如何从 Azure 函数返回 AcceptedAtRouteResult?
【发布时间】:2019-04-01 11:13:50
【问题描述】:

从 Azure 函数返回 AcceptedAtRouteResult 时,我不断收到 unhandles host 错误。

我希望能够从 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:索引 超出范围。必须是非负数且小于 收藏。参数名称:索引。

【问题讨论】:

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


【解决方案1】:

产品团队建议使用以下类来替换 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);
    }
}

bug 票可以在 Github 上追踪:https://github.com/Azure/azure-functions-host/issues/4267

【讨论】:

  • 我对 CreatedAtRouteResult 有同样的问题
  • 如果您遇到相同的错误,则可能是相同的错误 - 您可以在 Github 线程中添加评论,让产品团队知道有多种类型受到影响。如果是同样的错误,那么同样的解决方法应该同时起作用。
  • 我提交了 PR 来解决此问题,但值得注意的是,如果您使用的是 AcceptedAtRouteCreatedAtRoute,您必须定义一个映射到您在 Location 标头中返回的路线。这与 ASP.Net 所做的一致。如果你想将消费者指向你的函数应用边界之外的地方,你必须使用AcceptedResultCreatedResult 而不是它们的“Route”或“Action”对应物。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-25
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 2023-01-13
  • 1970-01-01
相关资源
最近更新 更多