Para leer el artículo original en inglés de Shivprasad koirala. http://www.codeproject.com/Articles/556995/MVC-Interview-questions-with-answers
Descargo de Responsabilidad (Disclaimer)
Leyendo esto no significa que podrás pasar entrevistas sobre MVC. El propósito de este artículo es pulir rápidamente tu conocimiento de MVC (Model View Controller) antes de una entrevista sobre MVC.
Este artículo no enseña MVC, es una hoja de revisión de último minuto antes de ir a una entrevista sobre MVC.
En caso que quieran aprender MVC de cero empiecen leyendo: http://www.codeproject.com/Articles/207797/Learn-MVC-Model-View-Controller-step-by-step-in-7 O pueden empezar con: https://www.youtube.com/playlist?list=PL33C9E91F8CDD2BF7
¿Qué es MVC (Model-View-Controller) Modelo-Vista-Controlador?
MVC es un patrón de arquitectura el cual separa la representación y la interacción del usuario. Está divido en 3 secciones. «Modelo», «Vista», «Controlador».
- La «Vista» es responsible por la apariencia «look and feel».
- El «Modelo» representa un objeto del mundo real y provee de data para la «vista».
- El «Controller» es responsable de tomar la petición del usuario y cargar el «modelo» y la «vista» apropiados.
¿Puedes explicar el flujo completo de MVC?
A continuación los pasos de como el control fluye en la arquitectura MVC (Modelo, Vista y Controlador).
- Toda petición (request) del usuario final es primero enviada al controlador.
- El controlador dependiendo de la petición decide cual modelo cargar. El controlador carga el modelo y enlaza el modelo con la vista apropiada.
- La vista final es luego enlazada con la data del modelo y enviada como una respuesta al usuario final en el navegador (browser).
¿Es MVC apropiado para aplicaciones web y windows ambas?
La arquitectura de MVC es más apropiada para aplicaciones web que windows. Para aplicaciones windows MVP por ejemplo «Modelo-Vista-Presentador» es más aplicable. Si estás usando WPF (Windows Presentation Foundation) o SilverLight MVVM (Modelo-Vista-ModeloVista) es más apropiado debido a los enlaces de datos (bindings)
¿Cuáles son los beneficios de usar MVC?
Hay dos grandes beneficios de MVC:
Separación de problemas (concerns) esto se logra ya que se mueve el código detrás (code behind) a un archivo de clase separado. Ya que se mueve el código de enlace (binding) a un archivo de clase separado podemos reutilizar el código en gran parte.
Testeo Automatizado de la UI (interfaz de usuario), es posible porque ahora el código detrás (code behind) el código de interacción de la UI ha sido movido a una simple clase .NET. Esto nos da la oportunidad de escribir pruebas unitarias y automatizar las pruebas manuales.
¿Es MVC diferente de la arquitectura de 3 capas?
MVC es una evolución de la arquitectura tradicional de 3 capas. Muchos componentes de la arquitectura de 3 capas son parte de MVC.
Functionalidad |
3 capas |
MVC |
Apariencia |
Interfaz de usuario. |
Vista |
UI lógica |
Interfaz de usuario. |
Controlador |
Lógica del negocio /validaciones |
Capa Intermedia |
Modelo |
La petición se envía primero a |
User interface |
Controlador |
Accediendo datos |
Capa de acceso a datos |
Capa de acceso a datos |
¿Cuál es la última versión de MVC?
Hasta la fecha hay 5 versiones de MVC. MVC 1, MVC 2, MVC 3, MVC 4 y MVC 5. El último es MVC 5.
¿Cuál es la diferencia entre cada versión de MVC?
En una entrevista es difícil hablar de todas ellas debido a la limitación de tiempo. He resaltado las principales diferencias.
MVC 2
Asistentes con plantilla (Templated Helpers) Areas Controladores Asíncronos
MVC 3
Razor Soporte para HTML5 en las plantillas de proyectos
MVC 4
ASP.NET Web API Nuevas características para soportar aplicaciones móviles
MVC 5
ASP.NET Identity Bootstrap en la plantilla MVC Filtros de autenticación Omisión de filtros (filter override)
¿Qué es ruteo en MVC?
El ruteo ayuda a definir una estructura de URL y mapear la URL con el controlador.
Por ejemplo digamos que queremos que cuando un usuario tipee «http://localhost/view/ViewCustomer/», vaya al controlador «customer» e invoque la acción «DisplayCustomer». Esto es definido agregando una entrada en la colección «routes» usando la función «maproute». Ejemplo:
routes.MapRoute(
"View", // Route name
"View/ViewCustomer/{id}", // URL with parameters
new { controller = "Customer", action = "DisplayCustomer",
id = UrlParameter.Optional }); // Parameter defaults
¿Dónde se tiene que escribir el código de mapeo de rutas?
En el archivo «global.asax».
¿Se puede mapear múltiples URLs a la misma acción?
Sí. Sólo necesitas hacer dos entradas con diferentes nombres clave y especificar el mismo controlador y acción.
¿Cómo podemos navegar de una vista a otra vista usando un hiperenlace?
Utilizando el método «ActionLink» como se muestra en el siguiente código. Ese código crea una simple URL la cual navegará al controlador «Home» e invocará la acción «Gotohome».
<%= Html.ActionLink("Home","Gotohome") %>
¿Cómo puedes restringir las acciones MVC para que sean invocadas solamente por un GET o POST?
Puedes decorar la acción MVC con un atributo «HttpGet» o «HttpPost» para restringir el tipo de llamada HTTP. Por ejemplo puedes ver en el siguiente código la acción «DisplayCustomer» puede ser solamente invocado por «HttpGet». Si tratamos de hacer un HTTP post en «DisplayCustomer» arrojará un error.
[HttpGet]
public ViewResult DisplayCustomer(int id)
{
Customer objCustomer = Customers[id];
return View("DisplayCustomer",objCustomer);
}
¿Cómo podemos mantener la sesión en MVC?
Las sesiones pueden ser mantenidas en MVC de 3 maneras: tempdata, viewdata y viewbag.
¿Cuál es la diferencia entre tempdata, viewdata y viewbag?
tempdata: Ayuda a mantener data cuando te mueves de un controlador a otro controlador o desde una acción a otra acción. En otras palabras cuando redireccionas, «tempdata» ayuda a mantener data entre esas redirecciones. Internamente utiliza variables de sesión.
View data: Ayuda a mantener data cuando te mueves de un controlador a una vista.
View bag: Es una envoltura dinámica alrededor de la data de la vista. Cuando utilizas «ViewBag» no es necesario hacer una conversión de tipo. Utiliza la palabra reservada «dynamic» internamente.
Variables de Sesión: Utilizando variables de sesión podemos mantener data de cualquier entidad a cualquier entidad.
Campos ocultos en controles HTML (hidden fields): Ayuda a mantener data de la UI hacia el controlador solamente. Se puede enviar data desde controles HTML o campos ocultos hacia el controlador usando métodos HTTP POST o GET.
Abajo hay una tabla que muestra la diferencia entre estos mecanismos de persistencia.
Maintains data between |
ViewData/ViewBag |
TempData |
Hidden fields |
Session |
Controller to Controller |
No |
Yes |
No |
Yes |
Controller to View |
Yes |
No |
No |
Yes |
View to Controller |
No |
No |
Yes |
Yes |
¿Qué son vistas parciales en MVC?
Vistas parciales es una vista reusable (como un control de usuario) las cuales pueden ser puestas dentro de otras vistas. Por ejemplo digamos que todas las páginas de tu sitio tiene una estructura estándar con un menú a la izquierda, cabecera y pie de página como se muestra en la siguiente imagen.
Para cada página tu necesitarías reutilizar el menú izquierdo, la cabecera y el pie de página. Puedes crear vistas parciales para cada uno de esos items y luego llamar a la vista parcial en la vista principal.
¿Cómo crear vistas parciales?
Cuando agregas una vista a tu proyecto necesitas marcar el check «Create Partial View».
Una vez creada la vista parcial puedes llamarla desde la vista principal utilizando el método «Html.RenderPartial» así:
<body>
<div>
<% Html.RenderPartial("MyView"); %>
</div>
</body>
¿Cómo podemos hacer validaciones en MVC?
Una de las maneras más fáciles de hacer validación en MVC es usar «data annotations». Data Annotations son atributos los cuales son aplicados en las propiedades del modelo. Por ejemplo en el siguiente código tenemos una simple clase cliente «customer» con una propiedad «customercode».
Esta propiedad «customercode» está etiquetada con un atributo de data annotation «Required» (requerido). En otras palabras si este modelo no recibe un «customercode» no será válido.
public class Customer
{
[Required(ErrorMessage="Customer code is required")]
public string CustomerCode { get; set; }
}
Para poder mostrar un error de validación necesitamos usar un método «ValidateMessageFor» el cual pertenece a la clase de apoyo «Html».
<% using (Html.BeginForm("PostCustomer", "Home", FormMethod.Post))
{ %>
<%=Html.TextBoxFor(m => m.CustomerCode)%>
<%=Html.ValidationMessageFor(m => m.CustomerCode)%>
<input type="submit" value="Submit customer data" />
<%}%>
Posteriormente en el controlador podemos chequear si el modelo está correcto o no utilizado la propiedad «ModelState.IsValid» y de acuerdo a eso tomar acciones.
public ActionResult PostCustomer(Customer obj)
{
if (ModelState.IsValid)
{
obj.Save();
return View("Thanks");
}
else
{
return View("Customer");
}
}
Abajo se muestra un simple mensaje de error:
¿Podemos mostrar todos los errores en una sola pasada?
Sí podemos, utilizando el método «ValidationSummary» de la clase HTML helper.
<%= Html.ValidationSummary() %>
¿Cuáles son los otros atributos para validación con Data Annotations en MVC?
Si quieres validar la longitud de una cadena, puedes utilizar «StringLength»
[StringLength(160)]
public string FirstName { get; set; }
En caso que quieras utilizar una expresión regular (regular expression)
[RegularExpression(@"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}")]
public string Email { get; set; }
Si quieres validar un rango de números, utiliza el atributo «Range»
[Range(10,25)]
public int Age { get; set; }
En algún momento querrás comparar el valor de un campo con el de otro campo, puede usar el atributo «Compare»
public string Password { get; set; }
[Compare("Password")]
public string ConfirmPass { get; set; }
En caso que quieras obtener un mensaje de error particular, puedes usar la colección «Errors».
var ErrMessage = ModelState["Email"].Errors[0].ErrorMessage;
Si has creado el objeto modelo tú mismo, puedes explícitamente llamar «TryUpdateModel» en tu controlador para chequear si el objeto es válido o no.
TryUpdateModel(NewCustomer);
En caso que quieras agregar errores en el controlador puedes utilizar la función «AddModelError».
ModelState.AddModelError("FirstName", "This is my server-side error");
¿Cómo podemos habilitar validación de Data Annotations en el lado del cliente?
Es un proceso de 2 pasos, primero referencia los necesarios archivos jQuery.
<script src="<%= Url.Content("~/Scripts/jquery-1.5.1.js") %>" type="text/javascript"></script>
<script src="<%= Url.Content("~/Scripts/jquery.validate.js") %>" type="text/javascript"></script>
<script src="<%= Url.Content("~/Scripts/jquery.validate.unobtrusive.js") %>" type="text/javascript"></script>
El segundo paso es llamar al método «EnableClientValidation»
<% Html.EnableClientValidation(); %>
¿Qué es Razor en MVC?
Es una máquina de vistas de peso ligero. Anteriormente sólo se podía utilizar un tipo de máquina de vistas ASPX. Razor fue introducido en MVC 3.
¿Por qué Razor cuando ya teníamos ASPX?
Razor es limpio, liviano y su sintáxis es fácil comparado con ASPX. Por ejemplo en ASPX para mostrar la hora teníamos que escribir:
<%=DateTime.Now%>
In Razor:
@DateTime.Now
¿Entonces cuál es mejor Razor o ASPX?
Según Microsoft Razor es el método preferido porque es liviano y tiene una sintáxis simple.
¿Cómo puedes hacer autenticación y autorización en MVC?
Puedes utilizar autenticación Windows o autenticación de formularios.
¿Como puedes implementar autenticación de Windows en MVC?
Para autenticación de windows necesitas modificar el archivo «web.config» y establecer el mode de autenticación a windows.
<authentication mode="Windows"/>
<authorization>
<deny users="?"/>
</authorization>
Luego en el controlador o en la acción puede utilizar el atributo «Authorize» el cual especifica cuáles usuarios tiene acceso a estos controladores y acciones. Abajo se muestra el código. Ahora solamente usuarios especificados enel controlador y la acción pueden acceder.
[Authorize(Users= @"WIN-3LI600MWLQN\Administrator")]
public class StartController : Controller
{
//
// GET: /Start/
[Authorize(Users = @"WIN-3LI600MWLQN\Administrator")]
public ActionResult Index()
{
return View("MyView");
}
}
¿Cómo implementas autenticación por formularios en MVC?
Autenticación por formularios es implementado en la misma forma en la que se hace en ASP.NET. El primer paso es establecer el modo de autenticación a formularios. El «loginurl» apunta al controlador en vez de a la página.
<authentication mode="Forms">
<forms loginUrl="~/Home/Login" timeout="2880"/>
</authentication>
Necesitamos crear un controlador donde revisaremos si el usuario es válido o no. Si el usuario es válido estableceremos un valor en una galletita (cookie).
public ActionResult Login()
{
if ((Request.Form["txtUserName"] == "Shiv") && (Request.Form["txtPassword"] == "Shiv@123"))
{
FormsAuthentication.SetAuthCookie("Shiv",true);
return View("About");
}
else
{
return View("Index");
}
}
Todas las otras acciones necesitan tener el atributo «Authorize» para que cualquier usuario no autorizado que haga una llamada a estos controladores sea redireccionado al controlador (en este caso el controlador es «login») el cual hará la autenticación.
[Authorize]
PublicActionResult Default()
{
return View();
}
[Authorize]
publicActionResult About()
{
return View();
}
¿Cómo implementar Ajax en MVC?
Puedes implementar Ajax de dos maneras en MVC:
- Bibliotecas Ajax (libraries)
- jQuery
Abajo hay un simple ejemplo de como implementar Ajax utilizando la biblioteca «Ajax» helper. En el código de abajo puedes ver que tenemos un simple formulario el cual es creado utilizando la sintáxis «Ajax.BeginForm». Este formulario llama a una acción en un controlador llamada «getCustomer». Ahora la accion enviar «submit» ejecutará una llamada Ajax asíncrona.
<script language="javascript">
function OnSuccess(data1)
{
// Do something here
}
</script>
<div>
<%
var AjaxOpt = new AjaxOptions{OnSuccess="OnSuccess"};
%>
<% using (Ajax.BeginForm("getCustomer","MyAjax",AjaxOpt)) { %>
<input id="txtCustomerCode" type="text" /><br />
<input id="txtCustomerName" type="text" /><br />
<input id="Submit2" type="submit" value="submit"/></div>
<%} %>
En caso quieras hacer llamadas Ajax en clics sobre hiperenlaces puedes utilizar la función «Ajax.ActionLink» como se muestra en el siguiente código.
Si quieres crear un enlace Ajax asíncrono de nombre «GetDate» el cual llama la función «GetDate» en el controlador, el código se encuentra debajo. Una vez que el controlador responda esta data es mostrada en la etiqueta html «Div» que tiene el nombre «DateDiv».
<span id="DateDiv" />
<%:
Ajax.ActionLink("Get Date","GetDate",
new AjaxOptions {UpdateTargetId = "DateDiv" })
%>
A continuación el código que va en el controlador. Como puedes ver la funcion «GetDate» tiene una pausa de 10 segundos.
public class Default1Controller : Controller
{
public string GetDate()
{
Thread.Sleep(10000);
return DateTime.Now.ToString();
}
}
La segunda manera de hacer llamadas Ajax en MVC es utilizando jQuery. En el ejemplo que sigue podemos ver que estamos haciendo una llamada POST a una URL «/MyAjax/getCustomer». Esto es hecho usando «$.post». Toda esta lógica se encuentra en una función llamada «GetData» y puedes hacer una llamada a la función «GetData» en un botón o un evento clic en un hiperenlace como quieras.
function GetData()
{
var url = "/MyAjax/getCustomer";
$.post(url, function (data)
{
$("#txtCustomerCode").val(data.CustomerCode);
$("#txtCustomerName").val(data.CustomerName);
}
)
}
¿Qué clase de eventos pueden ser registrados en Ajax?
¿Cuál es la diferencia entre «ActionResult» y «ViewResult»?
«ActionResult» es una clase abstracta mientras que «ViewResult» deriva de la clase «ActionResult». «ActionResult» tiene muchas clases derivadas como «ViewResult», «JsonResult», «FileStreamResult», etc.
«ActionResult» puede ser utilizada explotando polimorfismo y dinamismo. Si estas devolviendo diferentes tipos de vistas dinamicamente «ActionResult» es lo mejor. Por ejemplo en el código que sigue puedes ver que tenemos una simple acción llamada «DynamicView». Dependiendo de la bandera «IsHtmlView» devolverá un «ViewResult» o un «JsonResult».
public ActionResult DynamicView()
{
if (IsHtmlView)
return View(); // returns simple ViewResult
else
return Json(); // returns JsonResult view
}
¿Cuáles son los diferentes tipos de resultados en MVC?
Nota: Es difícil recordar todos los tipos. Los más importantes son «ActionResult», «ViewResult» y «JsonResult»
En la cima se encuentra «ActionResult» es cual es la clase base que puede tener 11 subtipos:
ViewResult – Muestra la vista especificada a la corriente (stream response) de respuesta
PartialViewResult – Muestra la especificada vista parcial a la corriente de respuesta.
EmptyResult – Una respuesta vacía es devuelta.
RedirectResult – Ejecuta una redirección HTTP a la URL especificada.
RedirectToRouteResult – Ejecuta una redirección HTTP a la URL que está determinada por la máquina de ruteo, basado en la data de ruteo dada.
JsonResult – Serializa un objeto ViewData en el formato Json
JavaScriptResult – Devuelve una pieza de código JavaScript que puede ser ejecutado en el cliente.
ContentResult – Escribe contenido a la corriente de respuesta sin requerir de una vista.
FileContentResult – Devuelve un archivo al cliente.
FileStreamResult – Devuelve una archivo al cliente, el cual es provisto por una corriente (stream)
FilePathResult – Devuelve un archivo al cliente
¿Que son «ActionFilters» en MVC?
«ActionFilters» ayudan a ejecutar lógica mientras una acción MVC está ejecutándose o después que una acción MVC se ha ejecutado.
Los filtros de acción son útiles en los siguientes escenarios:
- Implementar lógica antes que la acción suceda.
- Cancelar una ejecución actual.
- Inspeccionar el valor retornado.
- Proveer datos extra a la acción
Puedes crear filtros de acción de 2 maneras:
- En línea Inline Action Filter.
- Creando un atributo «ActionFilter».
Para crear un inline action filter necesitamos implementar la interfaz «IActionFilter». La interfaz «IActionFilter» tiene 2 métodos «OnActionExecuted» y «OnActionExecuting». Podemos implementar lógica de pre-procesamiento o lógica de cancelación en estos métodos.
public class Default1Controller : Controller , IActionFilter
{
public ActionResult Index(Customer obj)
{
return View(obj);
}
void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
{
Trace.WriteLine("Action Executed");
}
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
Trace.WriteLine("Action is executing");
}
}
El problema con un atributo «inline action» es que no puede ser reutilizado con otros controladores. Podemos convertir el inline action filter en una atributo. Para crear un atributo action filter necesitamos heredar de «ActionFilterAttribute» e implementar la interfaz «IActionFilter» como se muestra en el siguiente código:
public class MyActionAttribute : ActionFilterAttribute , IActionFilter
{
void IActionFilter.OnActionExecuted(ActionExecutedContext filterContext)
{
Trace.WriteLine("Action Executed");
}
void IActionFilter.OnActionExecuting(ActionExecutingContext filterContext)
{
Trace.WriteLine("Action executing");
}
}
Posteriormente podemos decorar los controladores en los cuales queremos el action filter que se ejecute. Podemos ver en el siguiente código que he decorado el «Default1Controller con la clase «MyActionAttribute» la cual fue creada en el código previo.
[MyActionAttribute]
public class Default1Controller : Controller
{
public ActionResult Index(Customer obj)
{
return View(obj);
}
}
¿Podemos crear una máquina de vistas personalizada utilizando MVC?
Sí, podemos crear nuestra propia máquina de vistas en MVC. Para crear nuestra propia máquina de vistas necesitamos seguir 3 pasos.
Digamos que queremos crear una máquina de vistas personalizada donde el usuario pueda tipear un comando como «» y muestre la fecha y hora actual.
Paso 1. Necesitamos crear una clase que implemente la interfaz «IView». En esta clase debemos escribir la lógica de como la vista será mostrada en la función «Render».
public class MyCustomView : IView
{
private string _FolderPath; // Define where our views are stored
public string FolderPath
{
get { return _FolderPath; }
set { _FolderPath = value; }
}
public void Render(ViewContext viewContext, System.IO.TextWriter writer)
{
// Parsing logic <dateTime>
// read the view file
string strFileData = File.ReadAllText(_FolderPath);
// we need to and replace <datetime> datetime.now value
string strFinal = strFileData.Replace("<DateTime>", DateTime.Now.ToString());
// this replaced data has to sent for display
writer.Write(strFinal);
}
}
Paso 2. Necesitamos crear una clase que herede de «VirtualPathProviderViewEngine» y en esta clase necesitamos proveer la ruta a la carpeta y la extension de la vista. Por ejemplo la extensión de Razor es «cshtml», para ASPX la extension es «.aspx», de la misma manera nuestra vista personalizada necesita que le demos una extensión. En el siguiente código establecemos «ViewLocationFormats» a la carpeta «Views» y la extensión «.myview».
public class MyViewEngineProvider : VirtualPathProviderViewEngine
{
// We will create the object of Mycustome view
public MyViewEngineProvider() // constructor
{
// Define the location of the View file
this.ViewLocationFormats = new string[] { "~/Views/{1}/{0}.myview", "~/Views/Shared/{0}.myview" }; //location and extension of our views
}
protected override IView CreateView(ControllerContext controllerContext, string viewPath, string masterPath)
{
var physicalpath = controllerContext.HttpContext.Server.MapPath(viewPath);
MyCustomView obj = new MyCustomView(); // Custom view engine class
obj.FolderPath = physicalpath; // set the path where the views will be stored
return obj; // returned this view paresing logic so that it can be registered in the view engine collection
}
protected override IView CreatePartialView(ControllerContext controllerContext, string partialPath)
{
var physicalpath = controllerContext.HttpContext.Server.MapPath(partialPath);
MyCustomView obj = new MyCustomView(); // Custom view engine class
obj.FolderPath = physicalpath; // set the path where the views will be stored
return obj; // returned this view paresing logic so that it can be registered in the view engine collection
}
}
Paso 3. Necesitamos registrar la vista en la colección de vistas personalizadas. El mejor lugar para registrar esta máquina de vistas personalizada es en la colección «ViewEngines» en el archivo «global.asax».
protected void Application_Start()
{
// Step3 :- register this object in the view engine collection
ViewEngines.Engines.Add(new MyViewEngineProvider());
<span class="Apple-tab-span" style="white-space: pre; "> </span>…..
}
Abajo está una simple muestra de la vista personalizada
¿Cómo enviar resultados en el formato Json en MVC?
En MVC tenemos la clase «JsonResult» la cual puede retornar data en el formato Json. Debajo hay un simple ejemplo el cual devuelve el objeto «customer» en el formato Json utilizando «JsonResult»
public JsonResult getCustomer()
{
Customer obj = new Customer();
obj.CustomerCode = "1001";
obj.CustomerName = "Shiv";
return Json(obj,JsonRequestBehavior.AllowGet);
}
Debajo se muestra el resultado del código anterior si invocas la acción via el navegador de internet.
¿Qué es el «WebAPI»?
HTTP es el protocolo más utilizado. Por muchos años el navegador de internet ha sido el cliente preferido por el cual podemos consumir data expuesta sobre HTTP. Pero como los años pasan y la variedad de clientes navegadores de internet ha crecido. Tenemos una demanda para consumir data en HTTP de clientes como móviles, javascripts, aplicaciones windows, etc.
Para satisfacer el rango amplio de clientes, «REST» fue la solución propuesta.
«WebAPI» es la tecnología por la cual podemos exponer data sobre HTTP siguiendo los principios de REST.
¿Pero WCF SOAP también hace la misma cosa, en qué difiere «WebAPI»?
SOAP: Es peso pesado por la complicada estructura WSDL, es independiente de los protocolos, para leer un mensaje SOAP el cliente necesita entender el formato WSDL. Escribir un código para leer un WSDL personalizado es una tarea pesada. Si el cliente es suficientemente inteligente para crear objetos proxy como se puede en .NET, entonces SOAP es más facil de consumir y llamar. SOAP sigue la especificación WS-*.
WebAPI: Peso ligero, solo la información necesaria es transmitida, sólo utiliza protocolo HTTP, la salida de WebAPI es una simple cadena: Json o XML. Escribir código es muy facil. Web API sigue los principios de REST.
¿Con WCF también puedes implementar REST, por qué utilizar «WebAPI»?
WCF se trajo para implementar SOA, la intención nunca fue implementar REST. «WebAPI» se construyó de cero y su única meta es crear servicios HTTP utilizando REST. Debido a que su único enfoque es crear servicios «REST» hace que WebAPI sea preferido.
¿Cómo implementar WebAPI en MVC?
Paso 1. Crea un proyecto utilizando la plantilla WebAPI.
Paso 2. Una vez que hayas creado el proyecto notarás que el controlador ahora hereda de «ApiController» y puedes implementar los métodos de protocolo HTTP «post», «get», «put» y «delete».
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
public string Get(int id)
{
return "value";
}
// POST api/values
public void Post([FromBody]string value)
{
}
// PUT api/values/5
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/values/5
public void Delete(int id)
{
}
}
Paso 3. Si haces una llamada HTTP GET deberías obtener los siguientes resultados.
¿Cómo puedo detectar que un controlador MVC es llamado por POST o GET?
Para detectar si la llamada en el controlador es una acción POST o GET podemos utilizar la propiedad «Request.HttpMethod» como se muestra a continuación.
public ActionResult SomeAction()
{
if (Request.HttpMethod == "POST")
{
return View("SomePage");
}
else
{
return View("SomeOtherPage");
}
}