Как указать параметр запроса в пользовательском HTTP-маршруте функции Azure? - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть функция Azure, и я хочу установить пользовательскую конечную точку HTTP.После ответа на этот вопрос SO у меня получилось что-то вроде этого:

[FunctionName("DoSomething")]
public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "v1/tenants/{tenantId}/locations/{locationId}/products?manufacturer={manufacturer}")]
                HttpRequest request, ILogger logger, string tenantId, string locationId, string manufacturer)
{
        // 
}

Однако маршрут не принимается Webjob:

"v1/tenants/{tenantId}/locations/{locationId}/products?manufacturer={manufacturer}"

Причина в том, что вопросительный знак '?':

Произошла ошибка при создании маршрута с именем 'DoSomething' и шаблоном 'api / v1 / tenants / {tenantId} / location / {locationId} / продукты? производитель = {производитель}».Дословный раздел 'products? Factory =' недопустим.Дословные разделы не могут содержать «?»персонаж.Имя параметра: routeTemplate Недопустимый буквенный раздел 'products? Manufacturer ='.Дословные разделы не могут содержать «?»символ.

Вопрос

Как указать параметр запроса в пользовательской конечной точке HTTP моей функции Azure?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Боюсь, что невозможно поместить параметр запроса в Route.

Microsoft.AspNetCore.Routing: буквенный раздел «products? Factory =» недопустим.Дословные разделы не могут содержать «?»символ.

Это встроенное ограничение маршрутизации ASP.NET, которое используется функцией Azure для построения маршрута для триггера Http.

позволяют мне получитьзначение в качестве одного из параметров метода Run вместо того, чтобы тыкать в экземпляр HttpRequest

Если по этой причине вы хотите поместить параметр запроса в маршрут, я бы предложил добавить IDictionary<string, string> query в сигнатуру метода ииспользуйте query["manufacturer"] для доступа к параметру в коде функции.Но, честно говоря, это почти то же самое, что и request.Query["manufacturer"].

. Или, возможно, вам придется следовать рекомендации, преобразовав параметр запроса в маршрут, например products/{productId}.

0 голосов
/ 11 февраля 2019

Вот пример моей функции, которая использует параметры запроса:

public static async Task<HttpResponseMessage> Run( HttpRequestMessage req, TraceWriter log, ExecutionContext context )
{
    string data = await req.Content.ReadAsStringAsync();
    dynamic parsed = JsonConvert.DeserializeObject(data);
    if (parsed == null)
    {
        parsed = req.GetQueryNameValuePairs().ToDictionary(kv => kv.Key, kv=> kv.Value, StringComparer.OrdinalIgnoreCase);
    }

    xxx
}

, и тогда вам нужно только указать имя параметра запроса, чтобы быть req, я думаю.если вы хотите идти по маршруту, предложенному Crowcoder, вы просто указываете свой путь в настройках (тег integrate):

enter image description here

Как видите, я неопределите маршрут, и он просто работает.Я подозреваю, что вам не нужно определять параметры запроса в вашем маршруте.

...