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)"
    }
  }
}

odata操作接受列表参数始终为null

如果将集合作为对象上名为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,并且它刚刚工作。