我有一个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终结点中指定查询参数?
答案 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
标签)中指定路径即可:
如您所见,我没有定义路由,它只是有效。我怀疑您不需要在路线中定义查询参数。