odata操作接受列表参数始终为null
本文关键字:null 参数 列表 操作 odata | 更新日期: 2023-09-27 18:00:24
我的odata控制器有问题。
我希望发送一个Address对象的列表,但收到的参数总是空的。
我的终点是这样的:
[EnableQuery]
public IHttpActionResult SetCoordinatesOnAddressList(IEnumerable<Address> addresses)
{
var result = addresses.Select(address => _coordinates.GetAddressCoordinates(address)).ToList();
return Ok(result);
}
我在WebApiConfig 中设置了这个
builder.EntityType<Address>().Collection
.Action("SetCoordinatesOnAddressList")
.ReturnsFromEntitySet<Address>("Addresses");
我正在使用Postman发送请求。
我的请求以邮件请求的形式发送,看起来如下:
[{"StreetName":"Some street","StreetNumber":"8","ZipCode":1234,"Town":"Some town"}]
我有一个不同的端点,它采用单个Address而不是IEnumerable,并且它适用于相同的json请求(没有[]),因此json中的字段是正确的。
综上所述:IEnumerable的终结点总是接收null。你知道是什么原因造成的吗?
谢谢。
编辑:
我试着改变我的终点以接受AddressDTO,就像这样:
public IHttpActionResult SetCoordinatesOnAddressList(AddressDTO addresses)
{
return Ok(2);
}
这是一个地址DTO:
public class AddressDTO
{
public IEnumerable<Address> Addresses { get; set; }
}
如果我试图发布这个:
{"Addresses": [{"StreetName":"Some street","StreetNumber":"8","ZipCode":1234,"Town":"Some town"}]}
我得到这个错误:
{
"error": {
"code": "",
"message": "The request entity's media type 'application/json' is not supported for this resource.",
"innererror": {
"message": "No MediaTypeFormatter is available to read an object of type 'AddressDTO' from content with media type 'application/json'.",
"type": "System.Net.Http.UnsupportedMediaTypeException",
"stacktrace": " at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)'''r'''n at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)'''r'''n at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)"
}
}
}
如果将集合作为对象上名为addresses的属性发送,会发生什么?
{"addresses": [{"StreetName":"Some street","StreetNumber":"8","ZipCode":1234,"Town":"Some town"}]}
[HttpPost]
[ODataRoute("SetCoordinatesOnAddressList")]
public IHttpActionResult SetCoordinatesOnAddressList(ODataActionParameters parameters)
{
IEnumerable<Address> addresses = parameters["addresses"] as IEnumerable<Address>;
var result = addresses.Select(address => _coordinates.GetAddressCoordinates(address)).ToList();
return Ok(result);
}
WebAPIConfig应该像这个
builder.Action("SetCoordinatesOnAddressList").Returns<IHttpActionResult>().CollectionParameter<Address>("addresses");
它不绑定到实体,因此访问方式如下localhost/odatea/SetCoordinatesOnAddressList
对于操作,为什么不使用ODataActionParameter
作为控制器中方法的参数?
这里有一个关于如何使用Action:的简单教程
http://odata.github.io/WebApi/#04-07动作参数支持
其中,"实体和实体参数集合"部分是相同的场景,因为我看到您将"地址"定义为实体类型。
建筑商。EntityType()。。。。
但是,"复杂和复杂参数集合"是复杂类型的场景。
我无法使用Odata控制器使其工作,我必须克服它,所以我最终做的是创建一个正常工作的API控制器。
public IHttpActionResult SetCoordinatesOnAddressList(IEnumerable<Address> addresses)
{
//Do stuff
}
这能够在没有任何设置的情况下接受地址IEnumerable,并且它刚刚工作。