如何在Azure函数的自定义HTTP路由中指定查询参数?

时间:2019-02-11 18:48:08

标签: c# azure azure-functions

我有一个Azure函数,我想设置一个自定义HTTP终结点。按照这个question的答案,我最终得到了这样的东西:

[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} / locations / {locationId} / products?manufacturer = {manufacturer}”。   文字部分'products?manufacturer ='无效。文字部分   不能包含“?”字符。参数名称:routeTemplate   文字部分'products?manufacturer ='无效。文字部分   不能包含“?”字符。

问题

如何在Azure函数的自定义HTTP终结点中指定查询参数?

2 个答案:

答案 0 :(得分:1)

恐怕无法在Route中放置查询参数。

  

Microsoft.AspNetCore.Routing:文字部分'products?manufacturer ='无效。文字部分不能包含“?”字符。

这是ASP.NET路由的内置限制,Azure Function使用它来建立Http触发器的路由。

  

允许我将值作为Run的方法参数之一获取,而不用戳HttpRequest实例

如果这是为什么要将查询参数放在路由中的原因,建议您在方法签名中添加IDictionary<string, string> query并使用query["manufacturer"]来访问函数代码中的参数。但老实说,它几乎与request.Query["manufacturer"]相同。

或者您可能必须遵循建议,将查询参数转换为类似products/{productId}的路线。

答案 1 :(得分:0)

这是我的使用查询参数的函数的示例:

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
}

然后,我认为您只需指定请求参数名称即可。如果您想按照路线编码器的建议进行操作,只需在设置(integrate标签)中指定路径即可:

enter image description here

如您所见,我没有定义路由,它只是有效。我怀疑您不需要在路线中定义查询参数。