【发布时间】:2019-07-09 17:52:43
【问题描述】:
我有一个 Ricks 的“原始请求正文”属性的实现,博客中提到了这里 ...
...我正在将解决方案转换为 .Net Core ...
有谁知道如何在 aspNet Core 中将其作为 OData 控制器参数的绑定属性来实现?
编辑:
如果它对任何人有帮助,这是我要转换的代码...
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; }
}
}
}
【问题讨论】:
标签: asp.net-core asp.net-core-mvc model-binding