#DevOps – WebSites, Azure and Error: Multiple types were found that match the controller named ‘messages’.

Hi!

I’ll leave it written down in a post so I will not forget later. Let’s start with the context

  • We work with a web App. For example, a Microsoft Bot App with Visual Studio
  • The deployment of it is done to Azure as part of an automated process (DevOps rules!)
  • Everything works perfectly

Until in a moment you find that your Web App does not work anymore. And when you try to navigate one of the controllers, a message like the following may appear

Multiple types were found that match the controller named ‘messages’. This can happen if the route that services this request (‘api/{controller}/{id}’) found multiple controllers defined with the same name but differing namespaces …

There are several reasons why this usually happens. However, one of the most popular is that you have renamed or changed some namespaces and new Dlls have been generated as part of the solution. The problem is that, by default, and as a mechanism to save processing time, the deployments only copy the assemblies that have been modified to the destination location. In this case, to an IIS folder, so a mix of files is in the bin folder.

Before continuing I have to take up the words of the great  Damian Brady (@damovisa):

Friends don’t let friends right-click publish

The first time you have seen an option that allows you to clean the destination directory and then copy the compilation directory is in the Publish option of a website in Visual Studio 2017

I1

Well, if you have configured the publication of your website as part of a Build – Releases process, it is in this last section that you will find the option [Remove additional files at destination], which will eliminate the unnecessary Assemblies of your solution.

I2

Happy Coding!

Greetings @ Toronto

El Bruno

#DevOps – WebSites, Azure y multiples controllers. Error: Multiple types were found that match the controller named ‘messages’.

Buenas!

Lo voy a dejar apuntado en un post para que luego no me olvide. Comencemos por el contexto

  • Trabajamos con una App web. Por ejemplo, una Microsoft Bot App con Visual Studio
  • El despliegue de la misma se realiza a Azure como parte de un proceso automatizado (DevOps rules!)
  • Todo funciona perfectamente

Hasta que en un momento te encuentras que tu Web App no funciona más. Y cuando intentas navegar uno de los controllers, puede aparecer un mensaje como el siguiente

Multiple types were found that match the controller named ‘messages’. This can happen if the route that services this request (‘api/{controller}/{id}’) found multiple controllers defined with the same name but differing namespaces …

Hay varios motivos por los que suele suceder esto. Sin embargo uno de los mas populares es que has renombrado o cambiado algunos namespaces y se han generado nuevas Dlls como parte de la solución. El problema está en que, por defecto, y como mecanismo para ahorrar trabajo, los despliegues solo copian los ensamblados que se han modificado a la ubicación de destino. En este caso, a un folder de IIS.

Antes de seguir tengo que retomar las palabras del gran Damian Brady (@damovisa):

Friends don’t let friends right-click publish

La 1ra vez que has visto una opción que te permite limpiar el directorio de destino y luego copiar el directorio de compilación es en la opción Publish de un website en Visual Studio 2017

I1

Pues bien, si has configurado la publicación de tu website como parte de un proceso de Build – Releases, es en esta última sección donde encontraras la opción [Remove additional files at destination], que eliminara los Assemblies innecesarios de tu solución

I2

Happy Coding!

Saludos @ Burlington

El Bruno

#VS2017 – Lessons learned migrating a UWP App from #Windows 8.1 to #Windows10 and how to replace Geolocation CivicAddress

Hi!

If you ever get bored, an 100% interesting activity is to try to update a project that has been closed 3 years ago or more. In my case, I have invested much time during these past days upgrading a Windows 8.1 to Windows 10 App.

Here’s a couple of things I’ve learned

  • Visual Studio 2017 is a thousand times better than previous Visual Studio versions to create UWP Apps. This point applies the saying “for tastes colors” in my case Visual Studio 2017 works great!
  • 3 years ago the most advisable option to share code/functionality between projects were to use Portable Class Libraries. Today this is very Old School, so I have migrated several projects to .Net Standard and it was not an easy path (ostias!)
  • I have suffered, in silence but pain was there. For example, .Net Standard its now in version 2.0, however, in order to create Net standard Class Libraries that can be used in UWP Apps, you have to “download” to version 1.4
  • No more CivicAddress. If you use localization functionality in your App, including values such as the country, city, zip code and State, the CivicAddress property has been declared obsolete from win 8.1

On this last point I will extend a bit. Well When you get the location in a UWP App, the 2 values that if returned are latitude and longitude. I was investigating a little bit about the best way to get an address from a point (latitude and longitude) and I came to this conclusion.

You can use services like the following where you must have a Developer key

Although thanks to StackOverflow I found a free service that with 4 lines solves the problem. This is OPENSTREETMAP and the following code is more than enough to understand how it works

public async Task<Tuple<string, string, string, string>> ResolveCountryAndCityNameAsync(double latitude, double longitude, string appName)
{
var lat = latitude.ToString(CultureInfo.InvariantCulture).Replace(",", ".");
var lon = longitude.ToString(CultureInfo.InvariantCulture).Replace(",", ".");
var requestUri = $"http://nominatim.openstreetmap.org/reverse?format=xml&zoom=18&lat={lat}&lon={lon}&application={appName}";
var client = new HttpClient();
var resTask = client.GetStringAsync(requestUri);
var res = await resTask;
var resultDocument = XDocument.Parse(res);
var addressElement = resultDocument.Root.Element("addressparts");
var city = addressElement.Element("city").Value;
var country = addressElement.Element("country").Value;
var postalCode = addressElement.Element("postcode").Value;
var state = addressElement.Element("state").Value;
var result = new Tuple<string, string, string, string>(country, city, postalCode, state);
return result;
}

A sample result in the next image

I1

that if, if your application requires a very intense use of this service, it is time to go back to Bing or Google to avoid a

System.Net.Http.HttpRequestException: ‘Response status code does not indicate success: 429 (Too Many Requests).’

I2

Happy Coding!

Greetings @ Toronto

El Bruno

References

#VS2017 – Lecciones aprendidas migrando una UWP App de #Windows 8.1 a #Windows10 y como reemplazar GeoLocation.CivicAddress

Buenas!

Si alguna vez te aburres, una actividad 100% interesante es intentar actualizar un proyecto que se ha cerrado hace 3 años o más. En mi caso, he invertido gran parte de estos últimos días en actualizar una App de Windows 8.1 a Windows 10.

He aquí un par de cosas que he aprendido

  • Visual Studio 2017 es mil veces mejor que las versiones anteriores para crear UWP Apps. Este punto se aplica el dicho “para gustos colores”, en mi caso VS2017 vuela.
  • Hace 3 años la opción mas recomendable para compartir código / funcionalidad entre proyectos eran Portable Class Libraries. Hoy esto es muy Old School, he migrado varios proyectos a .Net Standard y algún par de ostias he sufrido
  • Por ejemplo, .Net Standard va por su versión 2.0, sin embargo, para poder crear Net Standard Class Libraries que se puedan utilizar en UWP Apps, hay que “bajar” hasta la versión 1.4
  • No more CivicAddress. Si utilizas funcionalidades de localización en tu App, incluyendo valores como el país, ciudad, código postal y estado, la propiedad CivicAddress ha sido declarada obsoleta desde Win8.1

Sobre este último punto me extenderé un poco. Pues bien, cuando obtienes la ubicación en una UWP App, los 2 valores que si se retornan son latitud y longitud. Estuve investigando un poco sobre la mejor forma de obtener una dirección a partir de un punto (latitud y longitud) y llegué a esta conclusión

Puedes utilizar servicios como los siguientes donde debes tener una clave de Developer

Aunque gracias a StackOverflow encontré un servicio gratuito que con 4 líneas me resuelve el problema. Se trata de OpenStreetMap y el siguiente código es mas que suficiente para comprender como funciona

public async Task<Tuple<string, string, string, string>> ResolveCountryAndCityNameAsync(double latitude, double longitude, string appName)
{
var lat = latitude.ToString(CultureInfo.InvariantCulture).Replace(",", ".");
var lon = longitude.ToString(CultureInfo.InvariantCulture).Replace(",", ".");
var requestUri = $"http://nominatim.openstreetmap.org/reverse?format=xml&zoom=18&lat={lat}&lon={lon}&application={appName}";
var client = new HttpClient();
var resTask = client.GetStringAsync(requestUri);
var res = await resTask;
var resultDocument = XDocument.Parse(res);
var addressElement = resultDocument.Root.Element("addressparts");
var city = addressElement.Element("city").Value;
var country = addressElement.Element("country").Value;
var postalCode = addressElement.Element("postcode").Value;
var state = addressElement.Element("state").Value;
var result = new Tuple<string, string, string, string>(country, city, postalCode, state);
return result;
}

El resultado que retorna este servicio es similar a

I1

Eso si, si tu aplicación requiere un uso muy intenso de este servicio, es momento de volver a Bing o a Google para evitar un

System.Net.Http.HttpRequestException: ‘Response status code does not indicate success: 429 (Too Many Requests).’

I2

Happy Coding!

Saludos @ Toronto

El Bruno

References

#VS2017 – ASP.Net, IIS Express, #OneDrive and the error “The IIS Express applicationHost.config file contains invalid entries and must be corrected before you can open project”

Hi!

In recent months OneDrive has enabled a new feature that is great [Files On Demand]. If you have terabytes of information in OneDrive, this is a great way to optimize space and synchronization between multiple devices..

I1

Well, another feature that has OneDrive for a while is to automatically synchronize som of the information of your Windows Profile between different devices. For example, if you use 2 devices with the same OneDrive account, you can configure the account so that all the files that you have on your Desktop and in your Documents are synchronized between these devices.

I2

In my case, I usually develop on a PC with enough power and then I have my “crappy SurPro4” for demos and other sessions. I have enabled the option to synchronize the Desktops for a long time, and I think it will be a good idea to synchronize the also my Documents between this 2 machines.

Well, While I’m practicing a couple of sessions on Azure and Amazon Alexa I realized that when I opened a Web project on my Surface Pro 4 and when trying to load the same in Visual Studio 2017, I found this error

—————————

Microsoft Visual Studio

—————————

The IIS Express applicationHost.config file contains invalid entries and must be corrected before you can open project [$ProjectName].

Filename: redirection.config

Error: Cannot read configuration file

—————————

OK  

—————————

This got me on the nerves for a while, because the values in this file were correct. However, Visual Studio 2017 could not load ASP.Net projects. In a moment of lucidity, I realized that these files were not being loaded from [% USER_PATH] but from OneDrive

I3

And of course, it seems that IIS Express doesn’t get along with Onedrive. At this time the solution went through

  • Cancel the synchronization of the document folder
  • Configure my projects to use IIS instead of IIS Express

As the 2nd option is always much more practical at the time of work, I choose this one.  I’ve done this and everyone’s happy!

Happy Coding!

Greetings @ Toronto

El Bruno

References

#VS2017 – ASP.Net, IIS Express, #OneDrive y el freaking error “The IIS Express applicationHost.config file contains invalid entries and must be corrected before you can open project”

Buenas!

En estos últimos meses OneDrive ha habilitado una nueva feature que es grandiosa [Files On Demand]. Si tienes TeraBytes de información en OneDrive, esta es una excelente forma de optimizar el espacio y la sincronización entre varios dispositivos.

I1

Pues bien, otra feature que posee OneDrive desde hace un tiempo es la de sincronizar automáticamente tus perfiles entre diferentes Devices. Por ejemplo, si utilizas 2 dispositivos con la misma cuenta de OneDrive, puedes configurar el mismo para que todos los archivos que tengas en tu escritorio y en tus documentos se sincronizan entre estos dispositivos.

I2

En mi caso, suelo desarrollar en un PC con bastante potencia y luego tengo mi “crappy SurPro4” para demos y sesiones. Tengo activada la opción de sincronizar los Desktops desde hace tiempo, y se me ocurrió que tal vez sincronizar los documentos también era buena idea.

Pues bien, mientras estoy practicando un par de sesiones sobre Azure y Amazon Alexa me di cuenta que al abrir un proyecto web en mi Surface Pro 4 y al intentar cargar el mismo en Visual Studio 2017, me encontraba con este error

—————————

Microsoft Visual Studio

—————————

The IIS Express applicationHost.config file contains invalid entries and must be corrected before you can open project [$ProjectName].

Filename: redirection.config

Error: Cannot read configuration file

—————————

OK  

—————————

Esto me tuvo de los nervios un buen rato, ya que los valores en este archivo estaban correctos. Sin embargo, Visual Studio 2017 no podía cargar los proyectos ASP.Net. En un momento de lucidez, me di cuenta de que estos archivos no se estaban cargando del [%USER_PATH] sino desde OneDrive

I3

Y claro, parece que IIS Express no se lleva bien con Onedrive. En este momento la solución pasaba por

  • Cancelar la sincronización de la carpeta de Documentos
  • Configurar mis proyectos para que utilicen IIS en lugar de IIS Express

Como la 2da opción es siempre mucho mas practica al momento de trabajar, pues esto es lo que he hecho y todos felices.

Happy Coding!

Saludos @ Toronto

El Bruno

References

#VS2017 – Main Namespaces to be used in Q#

Hi!

When we create a new Q# (extension. qs) file, this new file has a main namespace (usualy our project name) and then it includes a series of namespaces that will be used in our operations. Something similar to this image

Clipboard02.jpg

The Q# file operation template includes 2 main namespaces to be used

    open Microsoft.Quantum.Primitive;

This namespace provides access to basic operations such as the Hadamard gates, X, M, CNOT gates, and more. The implementation of these operations depends on the target machine. This is important because we will have to take into account the process in a simulator or X Quantum Computer.

    open Microsoft.Quantum.Canon;

This namespace contains many useful functions for creating larger circuits, combinatorial and generic utilities. The implementation of the operations in the Canon is independent of the target machine, since they are built at the top of the primitive operations.

Happy QCoding!

Gretings @ Toronto

El Bruno

References

My Posts

 

#VS2017 – Namespaces principales para usar en Q#

 

Buenas!

Cuando creamos un fichero de Q# (extension .qs) el mismo suele estar definido por un Namespace y luego definir una serie de Namespaces que serán utilizados en nuestras operaciones

Usualmente se ve asi

Clipboard02.jpg

Los 2 namespaces que por defecto se agregan desde el template son

    open Microsoft.Quantum.Primitive;

Este namespace da acceso a operaciones básicas como las Hadamard Gates, CNOT Gates, etc. que son útiles para definir circuitos en operaciones cuánticas. La implementación de estas operaciones depende de la máquina de destino. Esto es importante ya que tendremos que tener en cuenta el proceso en un simulador o en X Quantum Computer.

    open Microsoft.Quantum.Canon;

El espacio de nombres Canon contiene muchas funciones útiles para crear circuitos más grandes, combinatorios y utilidades genéricas. La implementación de las operaciones en el Canon es independiente de la máquina de destino, ya que se construyen en la parte superior de las operaciones primitivas.

Happy QCoding!

Saludos @ Toronto

El Bruno

References

My Posts

 

#VS2017 – Releasing #Qubits using Reset() and ResetAll() in Q# on Microsoft Quantum Development Kit

HI!

Yesterday I wrote on the MResetZ() which allows us to get the status of a Qubit and release it. Well, at the end of each Q# operation, all the used Qubits need to be released for the simulator to work properly.

The following sample code will show a bad sample where a Qubit is used and not released correctly:

operation HGateWithOutReset (initial: Result) : (Result)
{
body
{
mutable res = Zero;
using (qubits = Qubit[2])
{
let qubit1 = qubits[0];
let qubit2 = qubits[1];
H(qubit1);
set res = M(qubit1);
}
return (res);
}
}

So, in runtime we will find this amazing and cool error:

I1

Microsoft.Quantum.Simulation.Simulators.Exceptions.ReleasedQubitsAreNotInZeroState

  HResult=0x80131500

  Message=Released qubits are not in zero state.

  Source=Microsoft.Quantum.Simulation.Simulators

Microsoft Quantum Development Kit offers us a series of operations that help us to release Qubits: Reset() and ResetAll(). As its name indicates Reset() is intended to release a single Qubit and ResetAll() to release an array of Qubits.

Given a single Qubit, Reset() evaluates the Qubit state and ensures that the Qubit is in the state |0⟩ so it can be safely released.

The following 2 operations show examples of how to use these operations

 

operation HGateWithResetEachQubit (initial: Result) : (Result)
{
body
{
mutable res = Zero;
using (qubits = Qubit[2])
{
let qubit1 = qubits[0];
let qubit2 = qubits[1];
H(qubit1);
set res = M(qubit1);
Reset(qubit1);
Reset(qubit2);
}
return (res);
}
}
operation HGateWithResetAllQubits (initial: Result) : (Result)
{
body
{
mutable res = Zero;
using (qubits = Qubit[2])
{
let qubit1 = qubits[0];
let qubit2 = qubits[1];
H(qubit1);
set res = M(qubit1);
ResetAll(qubits);
}
return (res);
}
}

Happy QCoding!

Greetings @ Toronto

El Bruno

References

My Posts

 

#VS2017 – Liberando #Qubits utilizando Reset() y ResetAll() con Microsoft Quantum Development Kit

 

Buenas!

Ayer comente como la operación MResetZ() nos permite obtener el estado de un Qubit y liberar al mismo. Pues bien, al final de cada operación los Qubits tienen que ser liberados para que el simulador funcione correctamente.

Nota: La palabra en inglés es Release, la traducción de “liberado” no me termina de gustar.

En un código como el siguiente, donde se utiliza un Qubit y no se libera correctamente, nos encontraremos con el siguiente error:

operation HGateWithOutReset (initial: Result) : (Result)
{
body
{
mutable res = Zero;
using (qubits = Qubit[2])
{
let qubit1 = qubits[0];
let qubit2 = qubits[1];
H(qubit1);
set res = M(qubit1);
}
return (res);
}
}

I1

Microsoft.Quantum.Simulation.Simulators.Exceptions.ReleasedQubitsAreNotInZeroState

  HResult=0x80131500

  Message=Released qubits are not in zero state.

  Source=Microsoft.Quantum.Simulation.Simulators

Microsoft Quantum Development Kit nos ofrece una serie de operaciones que nos ayudan a liberar Qubits: Reset() y ResetAll(). Como su nombre lo indica Reset() esta pensado para liberar un único Qubit y ResetAll() para liberar un array de Qubits.

Dado un solo qubit, Reset() evalua su etado y se asegura que está en el estado |0⟩ tal que pueda ser liberado con seguridad

La siguientes 2 operaciones muestran ejemplos sobre como utilizar estas operaciones.

operation HGateWithResetEachQubit (initial: Result) : (Result)
{
body
{
mutable res = Zero;
using (qubits = Qubit[2])
{
let qubit1 = qubits[0];
let qubit2 = qubits[1];
H(qubit1);
set res = M(qubit1);
Reset(qubit1);
Reset(qubit2);
}
return (res);
}
}
operation HGateWithResetAllQubits (initial: Result) : (Result)
{
body
{
mutable res = Zero;
using (qubits = Qubit[2])
{
let qubit1 = qubits[0];
let qubit2 = qubits[1];
H(qubit1);
set res = M(qubit1);
ResetAll(qubits);
}
return (res);
}
}

Happy QCoding!

Saludos @ Toronto

El Bruno

References

My Posts