我很惊讶我找不到答案,但是我有一个Azure函数(HTTP触发器),我只是想将内容反序列化为一个对象。以前,使用V1可以做到这一点,
功能V1
[FunctionName("RequestFunction")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "post", Route = null)]HttpRequestMessage req, TraceWriter log)
{
// Successful deserialization of the content
var accountEvent = await req.Content.ReadAsAsync<AccountEventDTO>();
// Rest of the function...
}
但是现在使用V2,它看起来更像这样
功能V2
[FunctionName("RequestFunction")]
public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)]HttpRequest req, ILogger log)
{
// Content doesn't exist on HttpRequest anymore so this line doesn't compile
var accountEvent = await req.Content.ReadAsAsync<AccountEventDTO>();
// Rest of the function...
}
我可以使主体从HttpRequest对象访问流,但是不确定如何将其强制转换为预期的对象。有什么想法吗?
答案 0 :(得分:8)
API有所更改。如您所见,Content
不再存在。但是,您仍然可以通过使用Microsoft.Azure.WebJobs.Extensions.Http
命名空间(应该已经作为依赖项包含)中包含的扩展方法来获得相同的功能:
string json = await req.ReadAsStringAsync();
您可以查看此扩展方法here的来源
然后您将使用Json.NET反序列化(Json.NET也已经是一个依赖项)
var someModel = JsonConvert.DeserializeObject<SomeModel >(json);
答案 1 :(得分:0)
如果您不知道对象的类型,可以执行以下操作:
string json = await req.ReadAsStringAsync();
dynamic data = JObject.Parse(json);
答案 2 :(得分:0)
您可以绑定到自定义对象,而不是HttpRequest。从请求的主体创建此对象,并将其解析为JSON。同样,可以将类型与200状态代码一起传递给HTTP响应输出绑定并作为响应主体返回。 示例:
public static partial class SayHelloFunction
{
[FunctionName("SayHello")]
public static async Task<ActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = null)]Person person, ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
return person.Name != null ?
(ActionResult)new OkObjectResult($"Hello, {person.Name}")
: new BadRequestObjectResult("Please pass an instance of Person.");
}
}
要绑定的模型。
public class Person
{
public Person()
{
}
public Person(string name)
{
Name = name;
}
public string Name { get; set; }
}
HTTP请求:[POST] http://localhost:7071/api/SayHello正文:{ 名称:“ Foo”}