我有一个odata控制器的问题。
我希望发送一个Address-objects列表,但接收的参数始终为null。
我的终点如下:
[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-request(没有[]),因此json中的字段是正确的。
总结一下: 我的IEnumerable端点始终为null。 可能导致它的任何想法?
谢谢。
编辑:
我尝试更改我的终点以接受AddressDTO,如下所示:
public IHttpActionResult SetCoordinatesOnAddressList(AddressDTO addresses)
{
return Ok(2);
}
这是一个AddressDTO:
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)"
}
}
}
答案 0 :(得分:3)
如果将集合作为名为address的属性发送到对象上,会发生什么?
{"addresses": [{"StreetName":"Some street","StreetNumber":"8","ZipCode":1234,"Town":"Some town"}]}
答案 1 :(得分:3)
为了采取行动,为什么不使用ODataActionParameter
作为控制器中方法的参数?
这是一个关于如何使用Action的简单教程:
http://odata.github.io/WebApi/#04-07-action-parameter-support
其中,部分&#34; 实体和实体集合参数&#34;是同一个场景,因为我看到你定义了&#34;地址&#34;作为实体类型。
builder.EntityType()......
然而,&#34; 复杂参数的复杂和集合&#34;是复杂类型的场景。
答案 2 :(得分:2)
[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");
它没有绑定到实体,因此像这样访问 本地主机/的OData / SetCoordinatesOnAddressList
答案 3 :(得分:1)
我无法使用Odata控制器工作,我不得不通过它,所以我最终做的是创建一个正常的API控制器,工作正常。
public IHttpActionResult SetCoordinatesOnAddressList(IEnumerable<Address> addresses)
{
//Do stuff
}
这可以接受一个没有任何设置的地址IEnumerable,它只是起作用。