У меня есть контроллер, подобный следующему:
using Microsoft.AspNetCore.Mvc;
public class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
}
[Route("api/[controller]")]
public class ValuesController : Controller {
[HttpGet]
public IActionResult Get() {
return new OkObjectResult(new[] {
new Person { FirstName = "John", LastName = "Doe" }
});
}
}
Я хотел бы иметь возможность указать свойства, которые я хочу получить из ответа в основном REST API asp.net.
Например,GET
до api/values
должен возвращать объект со всеми его свойствами:
{
"FirstName":"John",
"LastName":"Doe"
}
В то время как GET
до api/values?fields=FirstName
должен возвращать только свойство FirstName:
{
"FirstName":"John"
}
Я попытался указать ContractResolver в моем классе запуска следующим образом:
class QueryStringResolver : DefaultContractResolver {
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) {
HttpContextAccessor httpContextAccessor = new HttpContextAccessor();
string fieldsQuery = httpContextAccessor.HttpContext.Request.Query["fields"];
if (!string.IsNullOrEmpty(fieldsQuery)) {
var fields = from f in fieldsQuery.Split(",", StringSplitOptions.RemoveEmptyEntries) select f.Trim().ToLowerInvariant();
return base.CreateProperties(type, memberSerialization).Where(p => fields.Contains(p.PropertyName.ToLowerInvariant())).ToList();
} else {
return base.CreateProperties(type, memberSerialization);
}
}
}
public class Startup {
public void ConfigureServices(IServiceCollection services) {
services
.AddMvc()
.AddJsonOptions(options => {
options.SerializerSettings.ContractResolver = new QueryStringResolver();
});
}
// rest of Startup class omitted...
}
Проблема в том, что метод CreateProperties
вызывается только при первом запросе, а не для каждого запроса.
Есть ли способ указать, какие свойства должны сериализоваться при каждом запросе?
Обратите внимание, что Я не хочу менять реализацию метода Get или возвращенное определение класса , я быкак и в случае с сериализацией, чтобы я мог повторно использовать один и тот же параметр строки запроса в нескольких методах.