How to connect PHP with SQL on Azure Web Apps


Connecting a PHP web app with SQL server on Azure Web Apps is really simple:

We have two options here:

  1. Use PDO drivers (php_pdo_sqlsrv.dll) that is already configured in PHP version (5.4, 5.5 and 5.6) for 7.0 you need to upload the drivers from here Microsoft Drivers for PHP for SQL Server

Code example:


//SQL database information
$host = "tcp:<YOUR_SQL_SERVERNAME>.database.windows.net,1433";
$user = "<USER>@<SQLSERVERNAME>";
$pwd = "<YOUR PASSWORD>";
$db = "<DB NAME>";

try {
    $conn = new PDO( "sqlsrv:Server= $host ; Database = $db ", $user, $pwd);
    $conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

    $sqlQuery = $conn->query("SELECT * FROM [TABLE_NAME]");
    $result = $sqlQuery->fetchAll();
    echo "Row count: " . count($result) . ".";
}
catch(Exception $e){
    die(var_dump($e));
}

Use SQLSRV drivers (php_sqlsrv.dll) that is already configured in PHP version (5.4, 5.5 and 5.6) for 7.0 you need to upload the drivers from here Microsoft Drivers for PHP for SQL Server

Code example:


$host = "<YOUR_SQL_SERVERNAME>.database.windows.net,1433";
$user = "<USER>@<SQLSERVERNAME>";
$pwd = "<YOUR PASSWORD>";
$db = "<DB NAME>";

try
{
    $connectionOptions = array("Database"=> $db,"Uid"=>$user, "PWD"=>$pwd);
    $conn = sqlsrv_connect($serverName, $connectionOptions);
    if($conn == false)
      die( print_r( sqlsrv_errors(), true));

    $sqlQuery = sqlsrv_query($conn,"SELECT * FROM [TABLE_NAME]");

    if ($sqlQuery == FALSE)
      die( print_r( sqlsrv_errors(), true));

    $rowCount = 0;

    while($row = sqlsrv_fetch_array($sqlQuery, SQLSRV_FETCH_ASSOC)){
      echo($row['COLUMN_NAME']);
      $rowCount++;
    }

    sqlsrv_free_stmt($sqlQuery);
    sqlsrv_close($conn);
  }
  catch(Exception $e)
  {
    echo("Error!");
  }

If you are planning to connect a PHP 7.0 web app to a SQL Azure database, you may need to follow these steps:

Microsoft has published the RC of Microsoft Drivers 4.0 for PHP for SQL Server you can find the reference here: RC for PHP drivers for SQL Server
You can find it here the source code and dll to configure it on Azure Web App: GitHub source code for MS Azure PHP

Steps:

  1. Download the php_sqlsrv_7_nts.dll file and go to your Azure Web App on portal.azure.com
  2. Click in “All settings” -> Application settings -> Change to PHP 7 version -> Platform 32 bit.demo1
  3. In the same Application Settings, create a PHP_EXTENSIONS key in App Settings section. The value for this key would be a path relative to website root: bin\php_sqlsrv_7_nts.dll . We are going to upload this file and create the folder later. DEMO2
  4. Click Save at the top.
  5. Go to Kudu Console https://YOUWEBSITENAME.scm.azurewebsites.net/DebugConsole
  6. Navigate inside site\wwroot\ and create the folder with the following command:
    mkdir bin
    

    demo3

  7. Go inside the created folder and you can drag and drop the dll file to this folder as shown.demo4demo5
  8. Then you can test the sample code above with PHP version 7

Happy coding!

 

How to get additional Owin parameters in ValidateClientAuthentication WEB API?


Hello, I was programming a WEB API in C# and trying to send additional parameters from ClientId and ClientSecret implementing OAuthAuthorizationServerProvider, the way I did was to query the context.Parameters and check for key values.

   var additional_parameter = context.Parameters.Where(k =&gt; k.Key == &quot;additionalParameter&quot;).Select(v =&gt; v).FirstOrDefault();

Also you can implement just looking into the string array like this:

 string code = context.Parameters.Where(f =&gt; f.Key == &quot;code&quot;).Select(f =&gt; f.Value).SingleOrDefault()[0];
string state = context.Parameters.Where(f =&gt; f.Key == &quot;state&quot;).Select(f =&gt; f.Value).SingleOrDefault()[0];

-Edison

 

 

How to validate a FB access token in C#?


If you are developing a web app that is implementing custom OAuth and social networks, sometimes you are going to face how to validate access tokens in your web app.

Here I am sharing an sample of how we can validate a Facebook access token in our code.

using (HttpClient client = new HttpClient())
{
using (HttpResponseMessage response = await client.GetAsync(string.Format("https://graph.facebook.com/me?access_token={0}", access_token)))
{
if (response.IsSuccessStatusCode)
{
responseResult = await response.Content.ReadAsStringAsync();
}
else
{
responseResult = await response.Content.ReadAsStringAsync();
}
}
}

Notice that we are just using the https://graph.facebook.com/me?access_token=YOURTOKEN to validate it. You can also use JsonConvert to get that data into an object and handle it better.

-Edison

¿Como recuperar la contraseña de un Application Pool en IIS 7 con C#?


Algunas veces como Administradores de Windows Server 2008, se nos ha olvidado alguna vez la contraseña de algún Application Pool de IIS, es por eso, que he creado un pequeño código en C# para poder recuperar esta contraseña, espero que les sirva de gran utilidad:

Continue reading “¿Como recuperar la contraseña de un Application Pool en IIS 7 con C#?”

Configurar el Recycling de los Application Pools en un horario no productivo


Dejar por default esta configuración (1740 minutos) puede afectar el aplicativo cada 29 hrs, ya sea que se cumpla está condición en un horario de producción o no, se reciclará el Application Pool, perdiendo sesiones y liberando memoria y procesamiento. Lo recomendable es colocar un horario espécifico que no afecte a producción.

Recomendación para (IIS 6.0)

– Seleccione el Application Pool – Click derecho Properties

image

Se ha colocado por ejemplo un valor de 02:00 A.M., si existen más de un Application Pool, puede configurar un rango de 5 o 10 mins entre cada uno. Ejemplo:

  • · DefaultAppPool – 2:00 a.m
  • · WCFAppPool – 2:10 a.m
  • · AnotherAppPool – 2:20 a.m

Recomendación para (IIS 7.0 / 7.5)

– Seleccione el Application Pool y de click en la opción de Recycling…

image

Saludos.

EG.

Demasiados errores de crypt32 en tu servidor


Uno de los errores más frecuentes en servidores web es el siguiente:

EventVW-1

Error:

Tipo de suceso: error
Origen del suceso: crypt32
Categoría del suceso: ninguna
Id. de suceso: 8
Fecha: fecha
Hora: hora
Usuario: nombre de usuario
Equipo: nombre de equipo
Descripción:
Error de recuperación de actualización automática del número de secuencia de la lista raíz de terceros de: <http://www.download.windowsupdate.com/msdownload/update/v3/static/trustedr/en/authrootseq.txt&gt; con el error: Esta operación ha regresado debido a que el tiempo de espera ha caducado.
Para obtener más información al respecto, vea el Centro de ayuda y soporte técnico en http://support.microsoft.com.

La causa de este tipo de error es cuando el componente de Actualización de certificados raíz está activado y el server no se puede conectar con el servidor de Windows Update en internet, para actualizar automaticamente las entidades emisores de estos certificados. Si se tiene un servidor web con aplicativos que ocupan certificados y si se requiere actualizar las definiciones, entonces lo más recomendable es conectarse a internet, de lo contrario es mejor desactivarlo.

Para desactivar el componente Actualización de certificados raíz, siga estos pasos:

  1. En el Panel de control, haga doble clic en Agregar o quitar programas.
  2. Haga clic en Agregar o quitar componentes de Windows.
  3. Desactive la casilla de verificación Actualización de certificados raíz y continúe con el Asistente para componentes de Windows.

image

Referencia Web: http://support.microsoft.com/kb/317541/es

Saludos!.

No habilites el debugging en producción (ASP.NET)


Tu jefe se queja de que tu aplicación esta lenta en producción y en tu PC vuela sin límites. Antes de colocar tu aplicación web en Producción, deshabilita el debugging en todos los webconfigs que tengas. Si no lo haces, esto provoca que tu aplicativo se degrade y exista un bajo rendimiento. Es muy recomendable para ambientes de desarrollo pero no para productivos.

Cuando el debugging está habilitado, las peticiones de ASP.NET nunca terminan. Es decir cuando lo ocupamos en un ambiente de desarrollo podemos realizar un buen debugging con Visual Studio por que sabemos que dicha petición tiene un timeout definido por nosotros y que desaparecerá cuando hayamos realizado otra operación o terminemos el debugging por puntos. Pero en ambientes productivos eso es fatal, las peticiones no pueden tener timeouts infinitos.

Cuando el debugging está habilitado podemos crear mas de 100 dlls compiladas (Librerias), como es esto posible?

Bien. Cuando una página .aspx, asax o ascx es solicitada por primera vez, ASP.NET las compila dentro de un assembly. Este assembly tiene un nombre de 8 caracteres como 3ks0rnwz.dll o similar y guarda las clases de la página actual (No guarda el Code Behind). Esta dll se guarda en una carpeta llamada:

C:\WINDOWS\Microsoft.NET\Framework\NoVersion\Temporary ASP.NET Files

El code behind es compilado aparte en una librería principal, independiente de las dlls que se copiaron en la carpeta anterior.

Entonces si tenemos habilitado el debugging, se creará una dll por cada página que sea solicitada por primera vez y estará en modo debug. Si tenemos 100 paginas web, tendremos 100 dlls.

En cambio si tenemos deshabilitado el debugging cuando se realice alguna petición en cualquier página de nuestro aplicativo web, ASP.NET compilará todo dentro de un gran assembly. Las páginas ascx se compilarán en un emsamblado diferente de las páginas .aspx y estas páginas .aspx son compiladas en grupos basados en otros archivos si incluyen UserControls. Si tu aplicativo tiene diferentes subdirectorios, la compilación se llevará acabo en cada uno de ellos de manera separada. Es decir al final de tener 100 dlls, podrás tener solamente de 3 a 4, de acuerdo a lo que te comenté anteriormente.

Es muy fácil de detectar con un memory dump que aplicaciones (App Domains, librerias) están siendo utilizadas en modo debug.

0:016> !finddebugtrue
Debug set to true for Runtime: 61b48dc, AppDomain: /MyDebugApplication
Debug set to true for Runtime: 1f50e6d8, AppDomain: /MemoryIssues
Total 16 HttpRuntime objects

En un ambiente productivo es recomendable deshabilitar el debugging en todos los web.configs, lo podemos hacer manual por cada web.config

<compilation  debug="false"/>

o de forma general a nivel servidor.

<configuration>
    <system.web>
          <deployment retail=”true”/>
    </system.web>
</configuration>
    Saludos!.