У меня есть реализация атрибута Ricks "raw request body", о которой здесь написано ...
https://weblog.west -wind.com / сообщения / 2013 / Декабрь / 13 / прием-сырец-запрос тело контент-с-сеть САШИ, веб-API
... Я нахожусь в процессе преобразования решения в .Net Core ...
Кто-нибудь знает, как добиться этого в aspNet Core в качестве атрибута привязки для параметров контроллера OData?
EDIT:
В случае, если это кому-нибудь поможет, вот код, который я пытаюсь преобразовать ...
using System;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace Core.Api
{
/// <summary>
/// An attribute that captures the entire content body and stores it
/// into the parameter of type byte[].
/// </summary>
/// <remarks>
/// The parameter marked up with this attribute should be the only parameter as it reads the
/// entire request body and assigns it to that parameter.
/// </remarks>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Parameter, AllowMultiple = false, Inherited = true)]
public sealed class RawBodyAttribute : ParameterBindingAttribute
{
public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter)
{
if (parameter == null) throw new ArgumentException("Invalid parameter");
return new RawBodyParameterBinding(parameter);
}
}
public class RawBodyParameterBinding : HttpParameterBinding
{
public RawBodyParameterBinding(HttpParameterDescriptor descriptor) : base(descriptor) { }
public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
{
var binding = actionContext.ActionDescriptor.ActionBinding;
if(binding.ParameterBindings.Count(pb => pb.GetType() == typeof(RawBodyParameterBinding)) != 1)
throw new InvalidOperationException("Exactly one parameter must be marked with the RawBody attribute in the action signature.");
var type = binding.ParameterBindings.First(pb => pb.GetType() == typeof(RawBodyParameterBinding)).Descriptor.ParameterType;
if (type == typeof(string))
{
return actionContext.Request.Content
.ReadAsStringAsync()
.ContinueWith((task) => SetValue(actionContext, task.Result));
}
else if(type == typeof(byte[]))
{
return actionContext.Request.Content
.ReadAsByteArrayAsync()
.ContinueWith((task) => SetValue(actionContext, task.Result));
}
throw new InvalidOperationException("Only byte[] or string values are supported for [RawBody] parameters");
}
public override bool WillReadBody
{
get { return true; }
}
}
}