从HttpRequestMessage获取Route参数

时间:2019-04-04 17:06:51

标签: c# azure azure-functions

是否可以直接从HttpRequestMessage对象检索Azure函数的路由参数?

我知道我可以在函数定义中指定它们

public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "get", Route = "v1/inspectionOrders/{inspectionOrderId}")]HttpRequestMessage req, 
   string inspectionOrderId, TraceWriter log)

但是我需要从HttpRequestMessage中检索它们。我已经查看了请求对象,并使用键Properties将其保存在"MS_AzureWebJobs_HttpRouteData"字典下,但是直接访问它是一个坏主意。

如果我打电话

protected override async Task<HttpResponseMessage> RetrieveData(HttpRequestMessage req, string customerId)
{
   string objectId = req.GetRouteData()?.Values["objectId"] as string;

   ...
}

我会得到一个例外,因为IHttpRouteData集合不包含参数化的片段。

2 个答案:

答案 0 :(得分:0)

您可以使用var route=req.GetRouteData().Values.ToList()[0].Value;获取Route参数。另外,如果您要从路由中删除api ,则可以在host.json文件中添加以下代码。

{
  "http": {
    "routePrefix": ""
  }
}

工作快照:

enter image description here

答案 1 :(得分:0)

即使它已经很老了,我也只想分享我的解决方案。可能会对某人有所帮助。我已在Azure Function V3版本中使用它

services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();

在相应的类中注入上下文访问器

public abstract class ApiClientBase
    {
        private readonly IHttpContextAccessor httpContextAccesor;

        public ApiClientBase(IHttpContextAccessor httpContextAccesor)
        {
            this.httpContextAccesor = httpContextAccesor;
        }

        protected async Task<string> GetTenant()
        {
            var routeData = this.httpContextAccesor.HttpContext.Items["MS_AzureWebJobs_HttpRouteData"] as Dictionary<string, object>;
            return routeData["tenantId"] as string;
        }
    }