Azure功能 - 如何返回位置标题

时间:2017-10-14 21:57:38

标签: azure azure-functions

我是Azure功能的新手,有一个关于如何为新创建的资源生成位置标头的简单问题。我创建了一个简单的函数,用于创建一个Person(原始的呃?)。

在我的示例中,我使用DocumentDB进行存储。我想将一个Location标头返回给客户端,然后他们可以根据需要取消引用,但为此我需要了解路由。

我的代码如下......

public static class PersonProcessing
{
    [FunctionName("person")]
    public static async Task<HttpResponseMessage> Create(
        [HttpTrigger(AuthorizationLevel.Anonymous, "post")]HttpRequestMessage req,
        [DocumentDB("Test", "People", CreateIfNotExists = true)]ICollector<Person> outTable,
        TraceWriter log)
    {
        var tx = await req.Content.ReadAsAsync<Person>();

        tx.Id = Guid.NewGuid();

        outTable.Add(tx);

        var response = req.CreateResponse(HttpStatusCode.Created, tx);
        response.Headers.Location = new Uri($"{req.RequestUri}/{tx.Id}");
        return response;
    }

    public class Person
    {
        [JsonProperty("id")]
        public Guid Id { get; set; }

        public string Name { get; set; }
    }
}

我已根据传入的 RequestUri 创建了Location标头,但使用Azure Functions有更好(或更标准)的方法吗?

我在这里所做的是否接受了智慧 - 我在网上找不到任何有用的资源,因此我的问题是什么?

提前感谢您的回复。

3 个答案:

答案 0 :(得分:2)

我不知道有什么不同的方式,你所拥有的东西没有任何问题。它使用标准的HttpResponseMessage模式,而不是发明一种不同的方式来做到这一点。通常,http触发函数在处理request.response时只使用标准范例。

答案 1 :(得分:0)

我正在使用azure函数v2,并且上述方法似乎无效。但是我尝试了

        var headers = req.HttpContext.Response.Headers;
        var when = DateTime.UtcNow;
        var v = new StringValues(when.ToString("yyyy-MM-dd HH:mm:ss.ffffff"));
        headers.Add("now", v);

它似乎很好用。

答案 2 :(得分:0)

完成此操作的另一种方法是让函数返回CreatedResult,然后返回[FunctionName("TwoOhWhan")] public async Task<IActionResult> ReturnATwoOhWhanEvenIfCORSIsInThePicture( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "v1/test/twoohwhan")] HttpRequest req, ILogger logger) { // ... logic here var @return = new CreatedResult(location, new { id = resourceIdentifier }); //This trumped me for a while. In ASPNET Core you get this done by using //the extension method: .WithExposedHeaders("Location") req.HttpContext.Response.Headers.Add("Access-Control-Expose-Headers", "Location"); return @return; }

例如:

return @return

我喜欢这种方法,因为它更容易通过返回表示201本身的结果来收集正在发生的事情。

在这个答案之上,我有点锦上添花。查看关于startup.cs语句的右行。如果您要向HTTP触发的函数发出跨源请求,那么您将陷入困境。位置标头将在提琴手或网络镶边选项卡中可见,但您无法在JS代码中访问它。

通常,这是在aspnetcore设置的CORS文件中处理的,但是azure函数无法执行此操作。在Platform Settings部分下的{{1}}设置页面中,天蓝色门户仪表板也没有提供执行此操作的选项。

enter image description here

它不是很直观,因此很难从Internet上获得有关此小警告的信息。希望这可以帮助处于类似情况的其他人。