#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
orCreatedAtRoute
, у вас должна быть определена функция, которая сопоставляется с маршрутом, который вы возвращаете вLocation
заголовке. Это соответствует тому, что ASP. Net делает. Если вы хотите указать потребителю место за пределами вашего функционального приложения, вы должны использоватьAcceptedResult
илиCreatedResult
, а не их аналоги «Маршрута» или «Действия».