.Net Core 3.0: Oficialmente Lanzado

El 23 de septiembre se anuncio el lanzamiento oficial de .Net Core 3.0. Esta versión tiene muchas mejoras muy esperadas por los desarrolladores. Entre ellas se encuentran la posibilidad de crear aplicaciones Windows Forms y Windows Presentation Foundation con .Net Core, una nueva API JSon, nuevos soportes para ARM64 y muchas mejoras de rendimientos. También se encuentra incluida la versión 8 de C# con características muy interesantes que veremos en este post.

Para empezar veamos los cambio en los componentes. Para esta comparación he utilizado la herramienta NDepend la cual nos permite comparar las 2 versiones de .Net Core. En nuestro caso la versión 2.2 y la 3.0. Puedes descargar la herramienta desde aquí.
Una vez instalada la aplicación y ejecutada, seleccionaremos la opción Compare 2 versions of a code base.

Luego seleccionaremos las carpetas a comparar y le presionaremos el boton ok.

A simple vista podemos ver que disponemos de mas cantidad de ensamblados, 156 para la versión 2.2 y 165 para la versión 3.0. Una vez que términos la ejecución de las comparaciones, mediante algunas consultas, podemos obtener los siguientes resultados:

  • 29 espacios de nombres nuevos.
  • 359 tipos nuevos.
  • 3845 miembros nuevos.
  • 1044 métodos nuevos.
  • 166 Campos nuevos.

Con estos números podemos ver que el equipo de .Net Core ha trabajado muy arduamente y el framework ha crecido significativamente en funcionalidades.

Les dejo los links a las consultas realizadas y los reportes que nos entrega la herramienta NDepend. Aquí.

Novedades

Podemos descargar .Net Core 3.0 desde aqui. También se encuentran disponibles la nueva versión de Visual Studio 2019 16.3 y Visual Studio para MAc 8.3 con el soporte necesario para utilizar .Net Core 3.0. Otros lanzamientos relacionado, tambien muy importantes, son ASP.Net Core 3.0 y Entity Framework 3.0.

Plataformas Soportadas

.Net Core 3.0 es compatible con los siguientes sistemas operativos:

  • Alpino: 3.9+
  • Debian: 9+
  • openSUSE: 42.3+
  • Fedora: 26+
  • Ubuntu: 16.04+
  • RHEL: 6+
  • SLES: 12+
  • macOS: 10.13+
  • Cliente de Windows: 7, 8.1, 10 (1607+)
  • Servidor Windows: 2012 R2 SP1 +

Debemos tener en cuenta que Windows Forms y Windows Presentation foundation por el momento solamente funcionan en entornos Windows.

El soporte para Chips es:

  • x64 en Windows, macOS y Linux
  • x86 en Windows
  • ARM32 en Windows y Linux
  • ARM64 en Linux (kernel 4.14+)

Nota: .NET Core 3.0 ARM64 necesita la versión 4.14 del kernel de Linux o superior. 

Puntos más destacados

Las mejoras clave más importantes que  llaman la atención son las siguientes:

  • .NET Core 3.0 ha sido probado durante meses por muchos equipos de Microsoft que pronto implementarán en entornos productivos con grandes cargas de trabajo .
  • El rendimiento se ha mejorado notoriamente en varios sus componentes.
  • C # 8 agrega streams asíncronos, rango e índices, más patrones y tipos de referencia anulables. Nullable nos permite apuntar directamente a fallas en el código que conducen a NullReferenceException . Puede verlo en mi post anterior donde trato estas mejoras. aquí.
  • .NET Standard 2.1 incrementa el conjunto de tipos que podemos usar en el código. Puede usarse tanto con .NET Core como con Xamarin. .
  • Las aplicaciones de escritorio de Windows ahora son compatibles con .NET Core, tanto para Windows Forms como para WPF (y de código abierto). El diseñador de WPF es parte de Visual Studio 2019 16.3. El diseñador de Windows Forms todavía está en versión preliminar y disponible como descarga VSIX. Descargalo desde aqui
  • Las aplicaciones .NET Core ahora tienen ejecutables por defecto. En las versiones anteriores, las aplicaciones debían iniciarse con el comando dotnet myapp.dll , como dotnet myapp.dll. Nuestras aplicaciones ahora pueden iniciarse con un ejecutable específico de la aplicación, como myapp o ./myapp , dependiendo del sistema operativo.
  • Se han agregado API JSON de alto rendimiento para lectura y escritura, modelos de objetos y escenarios de serialización nuevos. Estas API fueron creadas desde cero sobre el genérico Span<T> y utilizan UTF8 en lugar de UTF16 . Estas API minimizan las asignaciones, lo que da como resultado un rendimiento superior y mucho menos carga de trabajo para el recolector de basura. 
  • El recolector de basura utiliza menos memoria de forma predeterminada. Esta mejora es beneficiosa para escenarios en los que varias aplicaciones están alojadas en el mismo servidor. El recolector de basura también se ha actualizado para hacer un mejor uso de gran cantidad de núcleos, en máquinas con más de 64 núcleos.
  • .NET Core ha sido mejorado para la utilización con Docker permitiendo que las aplicaciones .NET funcionen de manera predecible y eficiente en contenedores. El recolector de basura y el grupo de subprocesos se han actualizado para que funcionen mucho mejor cuando se ha configurado un contenedor con memoria limitada o CPU. Las imágenes Docker de .NET Core son más pequeñas, particularmente la imagen que contiene el SDK.
  • Los Raspberry Pi y ARM ahora son compatibles para permitir el desarrollo de IoT, incluso podemos utilizar el depurador remoto de Visual Studio. Podemos implementar aplicaciones que escuchen sensores e impriman mensajes o imágenes en una pantalla, todo utilizando las nuevas API GPIO. ASP.NET se puede usar para exponer datos como una API o como un sitio que permite configurar un dispositivo IoT.
  • .NET Core 3.0 será reemplazada por .NET Core 3.1 , a mediados de noviembre de este año .NET Core 3.1 será una versión compatible a largo plazo (LTS) (compatible durante al menos 3 años). Microsoft recomienda que se adopte antes .NET Core 3.0 y luego adoptar 3.1 para que nos sea más fácil actualizar nuestras aplicaciones.
  • .NET Core 3.0 estará disponible con RHEL 8 en Red Hat Application Streams, después de varios años de colaboración con Red Hat.
  • Visual Studio 2019 16.3 y Visual Studio para Mac 8.3 es es necesarios para el soporte .NET Core 3.0.
  • Los usuarios de Visual Studio Code debemos usar siempre la última versión de la extensión C # para asegurarse de que funcionen los escenarios más recientes.
  • La implementación de Azure App Service de .NET Core 3.0 está actualmente en curso.
  • La implementación de Azure Dev Ops de .NET Core 3.0 se realizará próximamente. Se actualizará cuando esté disponible.

Conclusión

.NET Core 3.0 es una nueva versión que  incluye un amplio conjunto de mejoras que nos tendrán entretenidos un buen tiempo. Es muy recomendable comenzar adaptar nuestras aplicaciones a la nueva versión para mejorar nuestro rendimiento y soporte. No debemos olvidar que dentro de unos meses estará disponible la versión 3.1, así que es una buena opción migrar nuestras app.

En próximos post veremos más en detalle las nuevas características y funcionalidades.


[Event] NetConfUy 2018 | Integrá fácilmente login social con Azure B2C y .NET

Viajamos con amigos  compañeros de trabajo para participar en la NetConfUy. Estuve tocando el tema de Azure B2C junto a .Net Core.

Hoy en día, muchas de las aplicaciones que construimos requieren inicio de sesión facilitada con redes sociales o proveedores de identidad pre-existentes. ¿Cómo puedo lograr limitar la construcción de código para llevarlo adelante? En esta charla te vamos a presentar Azure B2C y sus características, que te permiten integrar muy fácilmente inicios de sesión con redes sociales y proveedores de terceros, y la posibilidad de alojar en una base de datos escalable y redundante tus propios usuarios. Además, te vamos a mostrar cómo fácilmente podemos sumar funcionalidades de doble factor de autenticación, reseteo de password y muchas cosas más. La charla va a estar acompañada de demos donde veremos cómo integrar código personalizado de nuestras aplicaciones, móviles o web, login desde twitter, google, facebook, etc.

Les dejo los links de la presentación y videos.

Presentación

Video (Próximamente)

Entrevista (Próximamente)

[Event] NetConfAR 2018 | Crear tu Startup en Azure con menos de 10 dólares por mes!

Estuvimos con amigos  compañeros de trabajo participando como spaekaer en la gran .NetConfar 2018. Estuve tocando el tema de como crear una StartUp de la mano de Azure con un bajo costo.

¿Cuánta inversión es necesaria para que una empresa pueda tener su infraestructura tecnológica básica para operar? ¿Compro servidores o voy a la nube? ¿Qué servicios de la nube me conviene consumir? En esta charla te vamos a contar cómo se pueden utilizar diversos servicios de Microsoft Azure que son gratuitos o tienen muy bajo costo para lograrlo. Además de contártelo, veremos ejemplos de cómo utilizar estos servicios para poder construir una aplicación completa de punta a punta.

Les dejo los links de la presentación y los videos:

Presentación

Video Entrevista

Video Charla

[Article] .Net Core | User Secrets

En tiempo de desarrollo .Net Core nos brinda esta excelente funcionalidad la cual nos permite guardar configuraciones en nuestro perfil de usuario loca de una forma segura y sencilla. Estás funcionalidad nos ayuda a no subir por error o a no modificar los archivos con información privada en servidores o inclusive en nuestros sistemas de control de código fuente como GitHub, Bitbucket o Team Foundation Service.

Objetivo

En esta entrega estaremos viendo qué es, cómo configurar y utilizar User Secrets. .

Audiencia

Este documento está dirigido a personas que conocen muy poco o nada sobre el tema o personas que desarrollan tareas de consultoría de desarrollo o que simplemente están interesados en leer e investigar sobre la tecnología alcanzada por esta publicación.

Desarrollo

Antiguamente, en nuestras aplicaciones .Net, teníamos la posibilidad de encriptar nuestra información secreta contenida en los archivos web.config. Lo cual a veces lo hacía un poco incómodo al tener que implementar las aplicaciones o guardarlas en nuestros repositorios de código ya que se guardaban información sensible.

Ahora podemos guardar información sensible de la mano User Secrets de forma segura. Entre las cosas que podemos guardar tenemos: cadenas de conexión, claves de API, datos del cliente, datos de cualquier red social o de cualquier aplicación. Todo lo que nosotros consideremos como datos sensible puede ser almacenado sin correr riesgos de exponerla públicamente.

En mi caso me es muy útil cuando subo ejemplos a GitHub. Lo utilizo para subir un ejemplo sin la necesidad de tener que subir en el ejemplo los datos de acceso aun APi que utilizo en Azure o de alguna red social.

Microsoft.Extensions.SecretManager.Tools

Para poder utilizar y tener disponible esta funcionalidad deberemos usar Microsoft.Extensions.SecretManager.Tools.  Secret Manager almacena la información fuera del proyecto y nos permite no solo usar en el proyecto actual, también, nos brinda la posibilidad de usarlo en varios proyectos.

Lo instalaremos desde la consola de los paquetes Nuget en nuestra aplicación.

Una vez instalado hacemos botón derecho sobre nuestro proyecto y seleccionaremos del menú la opción “Manage User Secrets”:

Nos abrirá un archivo del tipo JSON llamado secrets.json. Este archivo guardaran los datos que necesitemos. Este se crea automáticamente y se ubica dentro de una carpeta protegida del sistema. podremos encontrarlo por medio de una estructura  de carpeta similar a esta:

%APPDATA%\Microsoft\UserSecrets\user-secrets-id\secrets.json

Si queremos ver el User-Secrets-Id podemos ubicarlo haciendo click derecho sobre el proyecto y seleccionado la opción “Edit <Nombre del proyecto>.csproj”. Este nos mostrar el archivo de configuración del proyecto con el id dentro:

En nuestro archivo JSON agregaremos un valor con motivo de poder tener información para poder ser consumida más adelante:

{
"TopSecret": "TopSecretValuePasssUserRoot"
}

El siguiente paso es configurarlo en nuestra aplicación Web el servicio. Abriremos el archivo Startup.cs y modificaremos el constructor para que lo tengamos disponible con las siguientes líneas:

Hasta ahora ya tenemos activo nuestro servicio de UserSecrets, agregamos un valor en nuestro archivo secrets.json y configuramos en el constructor para poder acceder. Ahora vamos a consumir el valor desde nuestro archivo. Iremos al HomeController.cs e inyectamos en constructor IConfiguration para tener disponible la consulta del valor:

Por último, Lo ejecutaremos y comprobaremos si está recuperando el error correctamente:

Conclusión

En este post hemos visto  que es, como configurarlo y cómo utilizar UserSecrets. El uso de esta funcionalidad no brinda una gran posibilidad de no estar obligados o por error a subir información confidencial de nuestras cuentas de redes sociales, conexión a base de datos o cualquier información sensible que consideremos.

[Article] Asp.Net Core | Manejo errores

Algo muy importante que deberíamos tener en cuenta en el desarrollo de nuestras aplicaciones es un correcto manejo de excepción. En varios de nuestros clientes notamos que no hacen uso de una forma correcta o directamente no es tenido en cuenta. Al ocurrir algún error dentro de una aplicación Asp.Net nos permite manejalo de varias formas de una manera simple y rápida.

Objetivo

El objetivo de esta publicación es tocar las posibles utilizaciones y alcance del manejo de errores propuesto por Asp.Net Core.

Audiencia

Este documento está dirigido a desarrolloradores que deseen conocer Asp.Net core o personas que desarrollan tareas de consultoría de desarrollo o que simplemente están interesados en leer e investigar sobre la tecnología alcanzada por esta publicación.

Desarrollo

Comencemos enumerando las diferentes tipos de excepciones, configuraciones y opciones que podemos utilizar:

  • Página de excepción para desarrollo.
  • Configurar excepciones personalizadas.
  • Configurando código de estado para las páginas.
  • Manejando código de excepciones.
  • Manejando código de excepciones en el servidor.
  • Manejo de excepción en el inicio de aplicación.
  • Manejo de excepciones en Asp.Net MVC.

Página de excepciones para desarrollo

La configuración por defaults de la página de errores tal vez es poca. Por este motivos, para obtener una mayor cantidad de información podemos instalar el paquete Nuget Microsoft.AspNetCore.Diagnostics. Luego de instalar el paquete debemos hacer la inyección correspondiente en el método Configure que se encuentra en el archivo startup.cs de la siguiente manera.


public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory){
loggerFactory.AddConsole();
env.EnvironmentName = EnvironmentName.Production;

if (env.IsDevelopment()){
app.UseDeveloperExceptionPage();
}else{
app.UseExceptionHandler("/error");
}
}

  • Recordemos que esto solo debe estar activo cuando la aplicación esté corriendo en un entorno de desarrollo.

Para ver la página  de excepción debemos correr la aplicación seteado en entorno de desarrollo y debemos agregar ?throw=true en la url. Podemos que la página incluye algunos tabs muy interesantes que contienen la información de la excepción y el request que hicimos. La primera solapa es Stack:

La solapa Query muestra los parámetros pasados por Query String si los hay.

La siguiente solapa es Cookies. Si hay cookies en el request van a aparecer en esta solapa.

Por último, tenemos la solapa de Headers donde podemos ver todos los encabezados enviados en el Request.

Configurar excepciones personalizadas

Cuando no estamos trabajando en un entorno de desarrollo es conveniente configurar un manejador especial.


public void Configure(IApplicationBuilder app, IHostingEnvironment env,
ILoggerFactory loggerFactory){
loggerFactory.AddConsole();
env.EnvironmentName = EnvironmentName.Production;
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/error");
}
}

En Asp.Net MVC no tenemos un decorador de errores para que ejecute una acción dependiendo de un método http. Para solucionar esto debemos tener un Action que sea ruteado a el como podemos ver en el siguiente código:

[Route("/Error")]
public IActionResult Index()
{
// Handle error here
}

Configurando código de estado para las páginas

Nuestra aplicación, por default, no muestra ningun codigo de estado para un código de estado de HTTP como podría ser el error 500(Internal Server Error) o el 404 (Not Found). Podemos configurar StatusCodePagesMiddleware en el método Configure en el archivo startup.cs

app.UseStatusCodePages();

Este middleware agregara un texto simple como podemos ver en la captura

app.UseStatusCodePages() puede soportar varios tipos de métodos. Alguno pueden ser expresiones del tipo lambda o tipos de contenido o formato de textos como podemos ver en los siguientes codigos:


app.UseStatusCodePages(async context =&gt;
{
context.HttpContext.Response.ContentType = "text/plain";
await context.HttpContext.Response.WriteAsync(
"Status code page, status code: " +
context.HttpContext.Response.StatusCode);
});

app.UseStatusCodePages("text/plain", "Status code page, status code: {0}");

En otros casos podemos redireccionar directamente a algún método que deseamos. por ejemplo, podemos devolver el error 302 al cliente pero también podemos redireccionarlo a un dirección url.

app.UseStatusCodePagesWithRedirects("/error/{0}");
app.UseStatusCodePagesWithReExecute("/error/{0}");

Si necesitamos desactivarlo por algún motivo simplemente debemos usar el siguiente código:

var statusCodePagesFeature = context.Features.Get&lt;IStatusCodePagesFeature&gt;();

if (statusCodePagesFeature != null)
{
statusCodePagesFeature.Enabled = false;
}

Manejando código de excepciones.

A menudo es una buena idea para las páginas de error en producción para constan de contenido puramente estática. Hay que tener en cuenta que una vez enviado los encabezados en el response es posible cambiar el estado de la respuesta como tampoco ejecutar otra página de excepción. El response debe ser completado o la conexión abortada.

Manejando código de excepciones en el servidor.

Recordemos que además de manejar las excepciones, en el servidor donde se encuentra alojada la aplicación, realizara alguna gestión sobre esa excepción. Algunos puntos para tener en cuenta son: Si el servidor detecta un error 500 antes de que se envíe al cliente se enviará un error sin contenido. Si se detecta una excepción después de que los cabeceros se han enviado, se cerrara la conexión, por último, las solicitudes que no son manejadas por la aplicación serán manejadas por los servidores. Cualquier configuración que hagamos en el manejo de excepciones no modificarán el comportamiento del servidor.

Manejo de excepción en el inicio de aplicación

Todas las configuraciones y situaciones anteriores ocurren durante el ciclo de vida de la aplicación. En caso de ocurrir un error durante el inicio de la aplicación se disparará una excepción a nivel servidor.

Manejo de excepciones en Asp.Net MVC.

Asp.Ne MVC  tiene algunas opciones mas para poder capturar errores como configurar excepción en los llamados filtros (filter) y validaciones en los modelos.

Exception Filters

Un filtro puede ser configurado de forma global o sobre un controller o  action basado en MVC. Los filtros pueden capturar una excepción que no haya sido configurada con anterior mientras ocurre la ejecución de un controlado o acción. Inclusive en un filtro.

Handling Model  State Errors

El Model Validation se ejecuta cuando el controlador y el action son invocados. Es posible invocarlo con el método ModelState.IsValid para verificar si el modelo está correct.

Conclusión

un buen manejo de errores puede evitarnos un dolor de cabeza muy grande cuando nuestra aplicación está fallando y no sabemos cuál es la causa.

[Event] Global Azure BootCamp 2018 | Azure B2C: servicio de identidad ágil para tus desarrollos.

El día de ayer estuvimos presentando Global Azure Bootcamp 2018 Buenos Aires el tema  Azure B2C. Les dejo los link de la presentación y los el video.

El día de ayer estuve presentando Global Azure Bootcamp 2017 Buenos Aires el tema  Azure B2C. Les dejo los link de la presentación y los el video.

Presentación

Video Charla

Video Entrevista

[Article] Azure | Integrando Azure Search en un Website

En en el artículos anterior (ir al articulo anterior) estuvimos viendo qué es Azure Search y como podemos configurarlo para comenzar a utilizarlo. En este artículo veremos cómo integrarlo en una Aplicación Web por medio del SDK que nos brindan.

Objetivo

En esta entrega estaremos integrando Azure Search en una Aplicación Web. Veremos sus características y funcionalidades plasmadas en un WebSite. El código del proyecto podrán descargo desde GitHub desde esta dirección

https://github.com/withoutdebugger/DemoAzureSearchWODv1

Audiencia

Este documento está dirigido a personas que conocen muy poco o nada sobre el tema o personas que desarrollan tareas de consultoría de desarrollo o que simplemente están interesados en leer e investigar sobre la tecnología alcanzada por esta publicación.

Desarrollo

Antes que nada necesitaremos el SDK. El SDK posee un conjunto de librerías de cliente las cuales las utilizaremos para manejar los índices, los datasource, indexadores, subir documentos, ejecutar queries y todo lo que necesitemos.

Las librerías principales son:

  • Azure.Search
  • Search.Models

Estas librerías tienen definidas algunas clases principales como Index, Field y Document como también algunas operaciones como Indexes.Create o Documents.Search asociadas a SearchServiceClient y SerachIndeCliente. Están agrupadas de una forma lógica para una mejor compresión.

Una vez listo el SDK en nuestra aplicación necesitaremos los ApiKey que Azure. Esta llave nos dará acceso al servicio y a base de búsqueda. La guardaremos en nuestra configuración de connections strings.

Para obtenerlos debemos ingresar al portal de Azure. Seleccionamos nuestro servicio de búsqueda -> opción claves:

Estas claves la usaremos dentro de nuestro archivo appsettings.json para tenerlas disponibles y consultarlas en el momento de consumir el servicio.

{
"AzureSearch": {
"SearchServiceName": "{nombre del servicio}",
"SearchServiceAdminApiKey": "{apikey}",
"SearchServiceQueryApiKey": "{apikey} "
},

...

}

Nuestra aplicación es una aplicacion ASP.Net Core MVC junto a una Web APi que será consumida por medio de JQuery. No voy a entrar en detalle de la aplicación MVC pero si en el servicio de búsqueda.

Tendremos el Home Controller que solamente nos devolverá la página inicial donde se encontrarán nuestros métodos en JQuery que consumirán los servicios de búsqueda.

Crearemos una Web API que se llamara Search. Será un controller llamado SearchController. Este recibirá en su constructor la clase IConfiguration para tener disponible el servicio de Azure Search.

{
searchServiceName = _configuration["AzureSearch:SearchServiceName"];
queryApiKey = _configuration["AzureSearch:SearchServiceQueryApiKey"];
indexClient = new SearchIndexClient(searchServiceName, "realestate-us-sample", new SearchCredentials(queryApiKey));
}

Nuestro método principal Get será el encargado de recibir las consultas desde el cliente. En esta primera versión filtra por texto, facets, tag y manejara la paginación. También tendremos algunos métodos privados que nos ayudaran a armar la consulta final.

Modelo Hotel

Este modelo es en el cual se transformara el resultado de Azure Search en nuestra aplicación.

public partial class Hotel
{
[System.ComponentModel.DataAnnotations.Key]
public string listingId { get; set; }
public string description { get; set; }
public string description_es { get; set; }
public string number { get; set; }
public string street { get; set; }
public string city { get; set; }
public string countryCode { get; set; }
public string postCode { get; set; }
public string thumbnail { get; set; }
public string status { get; set; }
public string[] tags { get; set; }
}

Get Method

El método principal recibirá los parámetros de consulta. Dentro podemos ver que tenemos los métodos privados CreateFilterFacets, CreateFilterTags, CreateParameter.

[HttpGet]
public DocumentSearchResul&lt;Hotel&gt; Get(string searchtext = "", string cityFacet = "", string typeFacet = "", string tags = "", string orderby = "", string derbydirection "desc", int actualPage = 1)
{
//Filter
string filter = CreateFilter(cityFacet, typeFacet);

//Filter Tags
IList&lt;ScoringParameter&gt; filterTags = CreatedFilterTags(tags);

//Parameters
SearchParameters sp = CreateParameter(10, filter, orderBy, filterTags, actualPage);

//Search
var result = indexClient.Documents.Search&lt;Hotel&gt;(searchtext, sp);
return result;
}

CreateFilterFacets

 Este método es el encargado de crear los filtros para los facets de City y Type. Como podemos ver en el método, el resultado un string que acompañará a la consulta. Azure Index utiliza una estructura OData formar las consultas. Por ejemplo, en el string el comando podemos ver el comando eq que significa igual. Podemos ver la lista completa de comando desde este link:

https://docs.microsoft.com/en-us/rest/api/searchservice/odata-expression-syntax-for-azure-search

private string CreateFilterFacets(string cityFacet, string typeFacet) {

string filter = "";

if (cityFacet != null)
{
filter += filter != string.Empty ? " and " : "";
filter += "city eq '" + cityFacet + "'";
}

if (typeFacet != null)
{
filter += filter != string.Empty ? " and " : "";
filter += "type eq '" + typeFacet + "'";
}

return filter;
}

CreateFilterTags

Este método es el encargado de crear una lista de Tags para filtrar. A diferencia del anterior, los tags deben filtrarse por medio de ScoringParameter que hace referencia a un nivel de acierto.

private IList&lt;ScoringParameter&gt; CreateFilterTags(string tags) {

IList&lt;ScoringParameter&gt; _parameterTags = new List&lt;ScoringParameter&gt;();

if (tags == null) { return _parameterTags; }

string[] _listTags = tags.Split(new[] { "," }, StringSplitOptions.RemoveEmptyEntries);

if (_listTags.Count() &amp;gt; 0)
{
_parameterTags.Add(new ScoringParameter("tags", _listTags));
}

return _parameterTags;
}

CreateParameter

Antes de la ejecución final de obtención de resultados debemos armar un SearchParamters. Desde este manejaremos la configuración principal de la consulta como el modo de búsqueda, cuántos tomar por medio de top, el filtro de text, el cálculo para la página, los campos que usaremos, si incluimos el total y los facets que filtraremos. Por último también se agregara tags correspondientes al ScoringParameters.

private SearchParameters CreateParameter(int top, string filter, IList&amp;lt;string&amp;gt; orderby, IList&amp;lt;ScoringParameter&amp;gt; filterTag, int currentPage)
{

SearchParameters searchParameters =
new SearchParameters() {
SearchMode = SearchMode.Any,
Top = 10,
Filter = filter,
Skip = currentPage - 1,
Select = new Lis&lt;String&gt;() { "listingId", "description", "description_es", "number", "street", "city", "countryCode", "postCode", "thumbnail", "status", "tags" },
// Add count
IncludeTotalResultCount = true,
//// Add facets
Facets = new List&lt;String&gt;() { "city", "type", "status", "tags" },
};

searchParameters.OrderBy = orderby;
searchParameters.ScoringParameters = filterTag;

return searchParameters;
}

Ejecución de resultado

Una vez que tenemos todo los objetos armados para nuestra consulta se llamará al siguiente método perteneciente al cliente de Azure Search.

var result = indexClient.Documents.Search&lt;Hotel&gt;(searchtext, sp);

indexClient es del tipo SearchIndexClient el cual es el encargado de realizar finalmente la consulta en nuestro servicio de Azure Search. Podemos ver que le enviaremos nuestra clase Hotel y el se encargara de hacer la transformación.

La aplicación

Finalmente nuestra aplicación se verá visualizará de la siguiente forma luego de una búsqueda:

Podemos filtrar la búsqueda por medio de la selección en cada una de las secciones City, Type y Tags para ajustar nuestros resultados. El encargado de ajustar la búsqueda sera los métodos creados en JQuery.

 

Conclusión

Azure Search es una excelente herramienta para realizar potentes búsquedas. También nos brinda un SDK muy potente para que podamos realizar consultas muy rápidamente y poder así integrar rápidamente en nuestras aplicaciones

Les dejos la aplicación de ejemplo en GitHub para que puedan consultarla:

https://github.com/withoutdebugger/DemoAzureSearchWODv1

También les dejo el link del demo:

http://wodazuresearch.azurewebsites.net/