¿Es una buena práctica limitar los verbos HTTP disponibles para cada acción? Mi código es más limpio sin [HttpGet]
, [HttpPost]
, [HttpPut]
, o [HttpDelete]
decorando cada acción, pero también podría ser menos robusto o seguro. No veo esto hecho en muchos tutoriales o códigos de ejemplo, a menos que el verbo sea explícitamente obligatorio, como tener dos acciones "Crear" donde la versión GET devuelve un nuevo formulario y la versión POST inserta un nuevo registro.Limitación de verbos HTTP en cada acción
Respuesta
Personalmente trato de respetar RESTful conventions y especificar el verbo HTTP a excepción de las acciones de GET que no modifican cualquier estado en el servidor por lo tanto permitiéndoles ser invocados con cualquier verbo HTTP.
No es necesario especificar el HttpGet, todos los demás sí es necesario
¿Significa que HttpGet está allí por defecto si no se especifica? –
No es una cuestión de "necesidad", sino "debería". Si se usa una acción para actualizar algo (por ejemplo, desde un POST AJAX), no * necesita * marcarlo con '[HttpPost]', pero parece que sería una buena idea. – MikeWyatt
Sí, creo que es una buena práctica limitar sus acciones solo al método HTTP apropiado que se supone debe manejar, esto mantendrá las solicitudes incorrectas fuera de su sistema, reducirá la efectividad de posibles ataques, mejorará la documentación de su código , aplicar un diseño de REST, etc.
Sí, utilizando el [HttpGet]
, [HttpPost]
.. atributos pueden hacer su código más difícil de leer, especialmente si también está usando otros atributos como [OutputCache]
, [Authorize]
, etc.
utilizo un pequeño truco con un IActionInvoker
personalizado, en lugar de usar atributos prefijo el método HTTP a th e acción nombre del método, por ejemplo:
public class AccountController : Controller {
protected override IActionInvoker CreateActionInvoker() {
return new HttpMethodPrefixedActionInvoker();
}
public ActionResult GetLogOn() {
...
}
public ActionResult PostLogOn(LogOnModel model, string returnUrl) {
...
}
public ActionResult GetLogOff() {
...
}
public ActionResult GetRegister() {
...
}
public ActionResult PostRegister(RegisterModel model) {
...
}
[Authorize]
public ActionResult GetChangePassword() {
...
}
[Authorize]
public ActionResult PostChangePassword(ChangePasswordModel model) {
...
}
public ActionResult GetChangePasswordSuccess() {
...
}
}
Tenga en cuenta que esto no cambia los nombres de las acciones, que son todavía LogOn
, LogOff
, Register
, etc.
Aquí está el código:
using System;
using System.Collections.Generic;
using System.Web.Mvc;
public class HttpMethodPrefixedActionInvoker : ControllerActionInvoker {
protected override ActionDescriptor FindAction(ControllerContext controllerContext, ControllerDescriptor controllerDescriptor, string actionName) {
var request = controllerContext.HttpContext.Request;
string httpMethod = request.GetHttpMethodOverride()
?? request.HttpMethod;
// Implicit support for HEAD method.
// Decorate action with [HttpGet] if HEAD support is not wanted (e.g. action has side effects)
if (String.Equals(httpMethod, "HEAD", StringComparison.OrdinalIgnoreCase))
httpMethod = "GET";
string httpMethodAndActionName = httpMethod + actionName;
ActionDescriptor adescr = base.FindAction(controllerContext, controllerDescriptor, httpMethodAndActionName);
if (adescr != null)
adescr = new ActionDescriptorWrapper(adescr, actionName);
return adescr;
}
class ActionDescriptorWrapper : ActionDescriptor {
readonly ActionDescriptor wrapped;
readonly string realActionName;
public override string ActionName {
get { return realActionName; }
}
public override ControllerDescriptor ControllerDescriptor {
get { return wrapped.ControllerDescriptor; }
}
public override string UniqueId {
get { return wrapped.UniqueId; }
}
public ActionDescriptorWrapper(ActionDescriptor wrapped, string realActionName) {
this.wrapped = wrapped;
this.realActionName = realActionName;
}
public override object Execute(ControllerContext controllerContext, IDictionary<string, object> parameters) {
return wrapped.Execute(controllerContext, parameters);
}
public override ParameterDescriptor[] GetParameters() {
return wrapped.GetParameters();
}
public override object[] GetCustomAttributes(bool inherit) {
return wrapped.GetCustomAttributes(inherit);
}
public override object[] GetCustomAttributes(Type attributeType, bool inherit) {
return wrapped.GetCustomAttributes(attributeType, inherit);
}
public override bool Equals(object obj) {
return wrapped.Equals(obj);
}
public override int GetHashCode() {
return wrapped.GetHashCode();
}
public override ICollection<ActionSelector> GetSelectors() {
return wrapped.GetSelectors();
}
public override bool IsDefined(Type attributeType, bool inherit) {
return wrapped.IsDefined(attributeType, inherit);
}
public override string ToString() {
return wrapped.ToString();
}
}
}
- 1. MVC3 REST Rutas y verbos Http
- 2. Servicios web RESTful y verbos HTTP
- 3. Resto de granulado fino Verbos HTTP compatibilidad con el navegador
- 4. ¿Hay alguna limitación de solicitudes HTTP simultáneas para Silverlight?
- 5. Global.asax Application_start activado en cada acción
- 6. Parse out verbos compuestos
- 7. Uso de verbos LINK y UNLINK HTTP en una API REST
- 8. ¿Cómo puedo sobrecargar Acciones ASP.NET MVC basadas en los verbos HTTP aceptados?
- 9. hacer: ejecutar una acción para cada requisito
- 10. ¿Cómo realizar una acción cada 5 resultados?
- 11. Jquery: realice una acción cada dos segundos
- 12. verbos REST: convención es "correcta"
- 13. ASP.NET Manejar verbos PUT/DELETE
- 14. Powershell Recibir vs Obtener verbos
- 15. Ejecute un método antes de cada acción en MVC3
- 16. Módulo HTTP frente a filtro de acción en asp.net-mvc
- 17. Limitación Classpath en Linux
- 18. Limitación de velocidad para controladores de rieles
- 19. Puede aplicar un ActionFilter en ASP.NET-MVC en CADA acción
- 20. Extracción de sustantivos y verbos del texto
- 21. nginx auth_basic limitación de tiempo
- 22. limitación random.shuffle de Python
- 23. ¿Limitación de JSON?
- 24. Usando MVC Miniprofiler para cada llamada de acción
- 25. ASP.NET MVC golpea la memoria de salida para cada acción
- 26. Enviando solicitud de HTTP Post con acción SOAP usando org.apache.http
- 27. WCF REST usando la limitación de tamaño de mensaje HTTP Post
- 28. limitación de array_agg en Postgresql 9.1
- 29. Limitación de llamadas asíncronas en Node.js
- 30. La limitación de Mono Runtime
Tal vez un mejor enfoque sería al revés, creando Atributos personalizados que niegan los verbos que no quieres. Nunca lo intenté, simplemente diciendo :-) – goenning