Como llamar a un Action Method MVC desde Silverlight

Trabajando en un proyecto que integra Silverlight y ASP.NET MVC, tuve la necesidad de hacer algo “extrano”, bueno quiza extrano para algunos. Necesite recuperar informacion que esta disponible en el contexto de MVC desde Silverlight, lo pongamos simple: Necesite llamar a un metodo, en este caso un ActionController desde el codigo de Silverlight.

En internet pueden encontrar muchos ejemplos, pero la gran mayoria son para realizar llamdas GET y considerando que quiero darle un poquitin mas de seguridad, pue mi requerimiento es solo permitir invocaciones POST…. y que dijeron? pues no hay muchos ejemplos clarificadores, entonces aqui va el mio.

A continuacion el ActionMethod que quiero invocar dese Silverlight:

1 [AcceptVerbs(HttpVerbs.Post)] 2 public ActionResult GetContextInformation() 3 { 4 return new Json(new ServiceConfiguration() 5 { 6 FullName = "UnknowData" 7 }); 8 }

La clase ServiceConfiguration, puede ser tan simple como la que se muestra a continuacion o tan compleja como deseemos. Esta clase es serializada a JSON para poder enviarla hacia Silverlight.

1 public class ServiceConfiguration 2 { 3 public string FullName { get; set; } 4 }

He aqui el codigo de Silverlight, para la invocacion del anterior ActionMethod:

 

1 private void GetWithWebRequest(string url) 2 { 3 var r = HttpWebRequest.Create(url) as HttpWebRequest; 4 r.Method = "POST"; 5 r.Accept = "application/json"; 6 r.BeginGetResponse(ReturnContext, r); 7 } 8 9 private void ReturnContext(IAsyncResult ar) 10 { 11 var request = ar.AsyncState as HttpWebRequest; 12 if (request != null) 13 { 14 var response = request.EndGetResponse(ar); 15 var jsonSerializer = new DataContractJsonSerializer(typeof(ServiceConfiguration)); 16 using (var stream = response.GetResponseStream()) 17 { 18 ServiceConfiguration ContextConfiguration = jsonSerializer.ReadObject(stream) as ServiceConfiguration; 19 } 20 //this.Dispatcher.BeginInvoke(() => 21 // PostRetrieved(Post)); 22 } 23 //if (OnInitializeServices != null) 24 // OnInitializeServices(this, EventArgs.Empty); 25 }

Aunque Resharper me sugiere reemplazar la invocacion de HttpWebRequest por una clase mas especifica como WebRequest, pues esta vez no le hago caso. Tambien observaran unos trozos de codigo comentado en el AsyncCallBack,, bueno estos los dejo para una explicacion futura. En este ejemplo no estoy pasando parametros al ActionMethod, pero podran encontrar bastante informacion de como hacerlo en Internet. El codigo es perfectamente compatible y usable con Windows Phone 7.

 

Espero que les sea util.

Un abrazo


CodeKata del Anagrama

En busqueda de la diversion y el aprendizaje me puse a realizar un CodeKata muy breve, que consiste en encontrar todos los anagramas de una palabra dada, los anagramas no son otra cosa que una permutacion de todos los caracteres de dicha palabra, por ejemplo si tenemos “abc”, los anagramas seran: abc, acb, bac, bca, cab, cba

A continuacion el codigo del metodo, es bastante simple, podria haberlo reducido un poco mas, pero en aras de la legibilidad y de que se pueda entender lo dejamos asi:

Como varios de los CodeKata tienen el proposito de incentivar la practica de TDD, aqui algunas pruebas unitarias que hice:

Para los interesados aqui el codigo fuente del proyecto y las pruebas, las pruebas contienen los casos que mas vinieron a mi mente, sabed disculparme si cometo algun error Smile

P.D. El enlace al video que les comente hace algunas semanas.