我是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有更好(或更标准)的方法吗?
我在这里所做的是否接受了智慧 - 我在网上找不到任何有用的资源,因此我的问题是什么?
提前感谢您的回复。
答案 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}}设置页面中,天蓝色门户仪表板也没有提供执行此操作的选项。
它不是很直观,因此很难从Internet上获得有关此小警告的信息。希望这可以帮助处于类似情况的其他人。