Как вернуть AcceptedAtRouteResult из функции Azure?

#c# #.net #azure #azure-functions #.net-standard

#c# #.net #azure #azure-функции #.net-стандартный

Вопрос:

Я продолжаю получать необработанные ошибки хоста при возврате AcceptedAtRouteResult из функции Azure.

Я хочу иметь возможность возвращать AcceptedAtRouteResult из функции Azure, чтобы сообщить вызывающей стороне значения по умолчанию для любых пропущенных параметров строки запроса, но я продолжаю получать необработанные ошибки хоста.

Я ориентируюсь на .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;
}
  

Я продолжаю получать исключение:

Произошла необработанная ошибка хоста. Система.Частное.CoreLib: индекс был вне диапазона. Должно быть неотрицательным и меньше размера коллекции. Имя параметра: индекс.

Комментарии:

1. Я воспроизвел проблему, и я считаю, что это ошибка во время выполнения. Вы можете отслеживать статус сообщения об ошибке здесь: github.com/Azure/azure-functions-host/issues/4267

Ответ №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);
    }
}
  

Сообщение об ошибке можно отследить на Github:https://github.com/Azure/azure-functions-host/issues/4267

Комментарии:

1. У меня такая же проблема с CreatedAtRouteResult

2. Если вы получаете ту же ошибку, то это, вероятно, та же ошибка — вы могли бы добавить комментарий в поток Github, чтобы команда разработчиков знала, что затронуто несколько типов. Если это та же ошибка, то тем временем должен сработать тот же обходной путь.

3. Я отправил PR, чтобы исправить эту проблему, но стоит отметить, что если вы используете AcceptedAtRoute or CreatedAtRoute , у вас должна быть определена функция, которая сопоставляется с маршрутом, который вы возвращаете в Location заголовке. Это соответствует тому, что ASP. Net делает. Если вы хотите указать потребителю место за пределами вашего функционального приложения, вы должны использовать AcceptedResult или CreatedResult , а не их аналоги «Маршрута» или «Действия».