asp.net - query - web api route attribute
WebApi: parámetro de asignación al valor del encabezado (3)
Gracias filipov por la respuesta. Tomé su código y lo modifiqué un poco para adaptarlo a mis necesidades. Estoy publicando mis cambios aquí en caso de que alguien pueda hacer uso de esto.
Hice 2 cambios.
Me gustó la idea de FromHeaderAttribute, pero sin subclases. Hice esta clase pública y requiero que el usuario establezca el nombre de param.
Necesitaba soportar otros tipos de datos además de la cadena. Por lo tanto, intento convertir el valor de la cadena al parameterType del descriptor.
Úselo así:
[HttpGet]
public void DeleteWidget(long widgetId, [FromHeader("widgetVersion")] int version)
{
...
}
Y este es mi FromHeaderBinding
public class FromHeaderBinding : HttpParameterBinding
{
private readonly string _name;
public FromHeaderBinding(HttpParameterDescriptor parameter, string headerName)
: base(parameter)
{
if (string.IsNullOrEmpty(headerName)) throw new ArgumentNullException("headerName");
_name = headerName;
}
public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
{
IEnumerable<string> values;
if (actionContext.Request.Headers.TryGetValues(_name, out values))
{
var tempVal = values.FirstOrDefault();
if (tempVal != null)
{
var actionValue = Convert.ChangeType(tempVal, Descriptor.ParameterType);
actionContext.ActionArguments[Descriptor.ParameterName] = actionValue;
}
}
var taskSource = new TaskCompletionSource<object>();
taskSource.SetResult(null);
return taskSource.Task;
}
}
He hecho algunas búsquedas, pero parece que no encuentro nada ...
Utilizando WebApi, me gustaría asignar un parámetro de entrada a un valor de encabezado: por ejemplo
Por ejemplo, en el controlador:
public User GetUser(int id){
...
return user;
}
Quiero que WebApi asigne el parámetro de id a un valor de encabezado (por ejemplo, X-Auth: 1234) ... en lugar de un parámetro de URL.
¿Esto es compatible?
No creo que esto sea compatible, como por ejemplo con el atributo [FromBody]. Parece que debería ser capaz de lograr esta funcionalidad mediante el uso de carpetas de modelo, como se describe aquí . En el archivador de modelos tiene acceso a la solicitud y sus encabezados, por lo que debería poder leer el encabezado y establecer su valor en la propiedad bindingContext.Model.
Editar: Leyendo más el artículo, parece una HttpParameterBinding personalizada y un ParameterBindingAttribute es una solución más apropiada, o al menos yo iría por este camino. Podría implementar un atributo [FromHeader] genérico, que hace el trabajo. También estoy luchando contra el mismo problema, por lo que publicaré mi solución una vez que lo tenga en su lugar.
Edición 2: Aquí está mi implementación:
public class FromHeaderBinding : HttpParameterBinding
{
private string name;
public FromHeaderBinding(HttpParameterDescriptor parameter, string headerName)
: base(parameter)
{
if (string.IsNullOrEmpty(headerName))
{
throw new ArgumentNullException("headerName");
}
this.name = headerName;
}
public override Task ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken)
{
IEnumerable<string> values;
if (actionContext.Request.Headers.TryGetValues(this.name, out values))
{
actionContext.ActionArguments[this.Descriptor.ParameterName] = values.FirstOrDefault();
}
var taskSource = new TaskCompletionSource<object>();
taskSource.SetResult(null);
return taskSource.Task;
}
}
public abstract class FromHeaderAttribute : ParameterBindingAttribute
{
private string name;
public FromHeaderAttribute(string headerName)
{
this.name = headerName;
}
public override HttpParameterBinding GetBinding(HttpParameterDescriptor parameter)
{
return new FromHeaderBinding(parameter, this.name);
}
}
public class MyHeaderAttribute : FromHeaderAttribute
{
public MyHeaderAttribute()
: base("MyHeaderName")
{
}
}
Entonces puedes usarlo así:
[HttpGet]
public IHttpActionResult GetItem([MyHeader] string headerValue)
{
...
}
Espero que ayude.
WebApi en DotNet Core tiene algunos atributos adicionales para extraer datos de la solicitud. Microsoft.AspNetCore.Mvc.FromHeaderAttribute leerá desde el encabezado de la solicitud.
public ActionResult ReadFromHeader([FromHeader(Name = "your-header-property-name")] string data){
//Do something
}