Posted on

Android java app with notification from asp.net mvc using firebase cloud messaging – part 3

Notification service in Android

Now we need to create in Android the service able to manage the notification incoming from firebase and to show these to user. Follow this usefull article Working easily with FCM push notifications in Android. You’ll have a class like this.

package com.mycompany.myfirstapp;

import android.app.Notification;
import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.media.RingtoneManager;
import android.net.Uri;
import android.os.Build;
import androidx.core.app.NotificationCompat;
import android.util.Log;

import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;

import androidx.core.app.NotificationManagerCompat;
import androidx.work.OneTimeWorkRequest;
import androidx.work.WorkManager;

//is the class that we can find in the manifest as a service

public class MyFirebaseMessagingService extends FirebaseMessagingService {

    public static final String TAG = "MsgFirebaseServ";

    @Override


    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);

        String title = "";
        String body = "";
        String objectId = "";
        String objectType = "";

        if (remoteMessage.getData() != null) {
            title = remoteMessage.getData().get("title");
            body = remoteMessage.getData().get("body");
            objectId = remoteMessage.getData().get("object_id");
            objectType = remoteMessage.getData().get("objectType");
        }

        Notification notification = new NotificationCompat.Builder(this)
                .setContentTitle(title)
                .setContentText(body)
                .build();
        NotificationManagerCompat manager = NotificationManagerCompat.from(getApplicationContext());
        manager.notify(/*notification id*/0, notification);
    }
}

Run your app on your device

Follow this instruction : https://developer.android.com/training/basics/firstapp/running-app

First test using your app in your device

  • Run the app on your device or emulator. The app should had created a new register id for the device and send it to asp.net mvc site. Now the device is registered.
  • Open Firebase console, go down in the menu on the left. Open Cloud Messaging session : you should find the possibility to send notification to your device starting from this page. So you can test correct developing of above class.

Send notification from asp.net mvc to firebase

For backend developers. You should create a class to manage notification to firebase. Follow the article Firebase push notifications using a .NET Backend to prepare a class to manage the notification to Firebase.

Then prepare your notification test task in a controller. Something like this :

        public Task<bool> NoteAsync()
        {
            var device = db.RegisteredDevices.Where(d => d.ENABLED == true);
            string[] da = new string[device.Count()];
            int i = 0;
            foreach (RegDevice r in device)
            {
                da[i] = r.ID;
                i++;     
            }
            string serverkey = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
            return FCMPushNotification.SendPushNotification(da,serverkey,"Title","body");
        }

Firebase messaging, where to get Server Key?

Click the Settings (Cog wheel) icon next to your project name at the top of the new Firebase Console, as per screenshot below:

  1. Click Project settings.
  2. Click on the Cloud Messaging tab.


Final test

Call the asp.net mvc method created. You should see a notification in your device.


Android java app with notification from asp.net mvc using firebase cloud messaging – part 1

Android java app with notification from asp.net mvc using firebase cloud messaging – part 2

Links



Posted on

Android java app with notification from asp.net mvc using firebase cloud messaging – part 2

In this scenario we looking to send the device registration id to a server with user data to save it in our database.

Token based authentication in ASP.NET Web API

For backend developers. ASP.NET Web API is a framework that makes it easy to build HTTP services that reach a broad range of clients. Follow the following article in order to implement Token based authentication using ASP.NET Web API 2. (Part 1 : Token based authentication in ASP.NET Web API)

To register the device you need a method like this

       [HttpPost]
       public HttpResponseMessage Register(string key)
        {
            
            var identity = (ClaimsIdentity)User.Identity;
            string message = "";
            if (!string.IsNullOrEmpty(key))
            {
                var userid = identity.GetUserId();
                RegDevice device = db.RegisteredDevices.Where(d => d.ID == key &&
                        d.USER == userid).FirstOrDefault();
                        if (device == null)
                        {
                            device = new RegDevice();
                            device.ID = key;
                            device.USER = userid;
                            db.RegisteredDevices.Add(device);
                            if (db.SaveChanges() > 0)
                                {
                                    return Request.CreateResponse(HttpStatusCode.OK);
                                }
                                else
                                {
                                    message = Vocabolario.ErrorInTemporaryStorage;
                                    //System.Diagnostics.Debug.WriteLine("PostServerLog. erore" + 
                                    message);
                                }
                        }  
            }
            HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.BadRequest, "value");
            response.Content = new StringContent(message, Encoding.Unicode);
            return response;
        }

Bearer authentication on Java

For frontend developers. To authenticated in a asp.net mvc site, first of all you have to generate the token using the username and the password. The token will conserve all the user’s data more the validation time. We will use this token to talk to our server.

Getting a token is not a goal per se. It’s a necessary step to call a protected API. The token needs to be used to access a Web API. The way to do it is by setting the Authorization header to be “Bearer”, followed by a space, followed by the access token.

To generate the token you should use something like this :

package com.mycompany.myfirstapp;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;

import javax.net.ssl.HttpsURLConnection;

import java.net.URL;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

import java.io.InputStream;
import org.apache.wink.json4j.JSONArray;
import org.apache.wink.json4j.JSONObject;
import org.apache.wink.json4j.JSONException;

import java.nio.charset.StandardCharsets;

import java.security.cert.Certificate;
import javax.net.ssl.SSLPeerUnverifiedException;

public class MyServer {

    private final static String BASE_URL = "https://www.mysite.com";
    private final static String TOKEN_ENDPOINT = BASE_URL + "/token";
    private final static String REGDEVICE_ENDPOINT = BASE_URL + "/api/Account/Register";

//pass username and password in this example
    public static String getToken(String user, String pwd) throws IOException, JSONException {
        byte[] postData = getRequestBodyForAccessToken(user,pwd);
        int postDataLength = postData.length;

        URL url = new URL(TOKEN_ENDPOINT);
        HttpsURLConnection requestConn = (HttpsURLConnection) url.openConnection();
        requestConn.setRequestMethod("POST");
        requestConn.setDoOutput(true);
        requestConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        try (DataOutputStream dos = new DataOutputStream(requestConn.getOutputStream())) {
            dos.write(postData);
        }

        if (requestConn.getResponseCode() != HttpURLConnection.HTTP_OK) {
            if (requestConn.getResponseCode() == HttpURLConnection.HTTP_MOVED_PERM) {
                String serverURL = requestConn.getHeaderField("Location");
                System.err.println("Set the value of the server path to: " + serverURL);
            }
            System.err.println("Error in obtaining an access token. " + 
            requestConn.getResponseMessage());
        }

        String accessToken;
        try (InputStream tokenStream = requestConn.getInputStream()) {
            JSONObject tokenRes = new JSONObject(tokenStream);
            accessToken = (String) tokenRes.get("access_token");
        }
        return accessToken;
    }

    public static void RegisterNewDevice(String deviceKey, String atoken)
    {
        StringBuilder urlBuilder = new StringBuilder(REGDEVICE_ENDPOINT);
        urlBuilder.append("&key=").append(deviceKey);
        String pathWithQueryParams = urlBuilder.toString();
        
        InputStream restRegApiStream = null;
        try {
            HttpsURLConnection restRegApiConn = getRestApiConnection(pathWithQueryParams);
            addAuthenticationHeader(restRegApiConnn, atoken);
            restRegApiConn.setRequestMethod("POST");
            
            if (restRegApiConn.getResponseCode() != HttpURLConnection.HTTP_OK) {
                if (restRegApiConn.getResponseCode() == HttpURLConnection.HTTP_UNAUTHORIZED) {
                    if (restRegApiConn.getHeaderField("www-authenticate").contains("invalid_token")) {
                       
                    }
                } else if (restRegApiConn.getResponseCode() == HttpURLConnection.HTTP_FORBIDDEN) {
                    
                }
                
            } else {
                restRegApiStream = restRegApiConn.getInputStream();
            }
        }
        catch(Exception ex)
        {

        }
    }

    private static HttpsURLConnection getRestApiConnection(String apiCall) throws IOException {
        URL restApiUrl = new URL(apiCall);
        HttpsURLConnection restApiURLConnection = (HttpsURLConnection) restApiUrl.openConnection();
        return restApiURLConnection;
    }

    private static void addAuthenticationHeader(HttpsURLConnection restApiURLConnection, String t) 
    {
        restApiURLConnection.setRequestProperty("Authorization", "Bearer " + t);
    }

    /**
     * Get the request body to be used for the POST request when requesting an access token.
     */
    private static byte[] getRequestBodyForAccessToken(String user, String pwd) {
        StringBuilder sb = new StringBuilder("grant_type=password");
        sb.append("&username=")
                .append(user)
                .append("&password=")
                .append(pwd);
        return sb.toString().getBytes(StandardCharsets.UTF_8);
    }

    private static void print_https_cert(HttpsURLConnection con){

        if(con!=null){

            try {

                System.out.println("Response Code : " + con.getResponseCode());
                System.out.println("Cipher Suite : " + con.getCipherSuite());
                System.out.println("\n");

                Certificate[] certs = con.getServerCertificates();
                for(Certificate cert : certs){
                    System.out.println("Cert Type : " + cert.getType());
                    System.out.println("Cert Hash Code : " + cert.hashCode());
                    System.out.println("Cert Public Key Algorithm : "
                            + cert.getPublicKey().getAlgorithm());
                    System.out.println("Cert Public Key Format : "
                            + cert.getPublicKey().getFormat());
                    System.out.println("\n");
                }

            } catch (SSLPeerUnverifiedException e) {
                e.printStackTrace();
            } catch (IOException e){
                e.printStackTrace();
            }

        }

    }

    private static void print_content(HttpsURLConnection con){
        if(con!=null){

            try {

                System.out.println("****** Content of the URL ********");
                BufferedReader br =
                        new BufferedReader(
                                new InputStreamReader(con.getInputStream()));

                String input;

                while ((input = br.readLine()) != null){
                    System.out.println(input);
                }
                br.close();

            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }
}

So now you have registered the device on the server. It’s time to send notification to your device


Android java app with notification from asp.net mvc using firebase cloud messaging – part 1

Android java app with notification from asp.net mvc using firebase cloud messaging – part 3

Links



Posted on

Android java app with notification from asp.net mvc using firebase cloud messaging – part 1

Firebase Project

For backend developers.

Follow the document : https://firebase.google.com/docs/android/setup

Important steps : Add Firebase using the Firebase console. After you have a Firebase project, you can add your Android app to it. Enter your app’s package name in the Android package name field. Click Download google-services.json to obtain your Firebase Android config file google-services.json)

Android app in java

For frontend developers

  • Install or update Android Studio to its latest version.
  • Make sure that your app meets the following requirements:
    • Targets API level 16 (Jelly Bean) or later
    • Uses Gradle 4.1 or later

In Android Studio create a new android app using java as language. To enable Firebase products in your app, pass to Project visualization (on the left of android studio) in your root-level Gradle file (build.gradle), add rules to include the Google Services Gradle plugin. Check that you have Google’s Maven repository, as well.

buildscript {

  repositories {
    // Check that you have the following line (if not, add it):
    google()  // Google's Maven repository
  }

  dependencies {
    // ...

    // Add the following line:
    classpath 'com.google.gms:google-services:4.3.3'  // Google Services plugin
  }
}

allprojects {
  // ...

  repositories {
    // Check that you have the following line (if not, add it):
    google()  // Google's Maven repository
    // ...
  }
}

In your module (app-level) Gradle file (usually app/build.gradle), apply the Google Services Gradle plugin:

apply plugin: 'com.android.application'
// Add the following line:
apply plugin: 'com.google.gms.google-services'  // Google Services plugin

android {
  // ...
}

To your module (app-level) Gradle file (usually app/build.gradle), add the dependencies for the Firebase products that you want to use in your app.

dependencies {
  // ...

  // Add the SDKs for the Firebase products you want to use in your app
  // For example, to use Firebase Authentication and Cloud Firestore
  implementation 'com.google.firebase:firebase-analytics:17.2.0'
  implementation 'com.google.firebase:firebase-messaging:20.1.0'

  // Getting a "Could not find" error? Make sure that you've added
  // Google's Maven repository to your root-level build.gradle file
}

Sync your app (at the top on the right of Android Studio) to ensure that all dependencies have the necessary versions.

Set up a Firebase Cloud Messaging client app on Android

For frontend developers. Follow the document : https://firebase.google.com/docs/cloud-messaging/android/client

Edit your app manifest. A service that extends FirebaseMessagingService. This is required if you want to do any message handling beyond receiving notifications

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.mycompany.myfirstapp">

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>
    <uses-permission android:name="android.permission.WAKE_LOCK"/>
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
    <uses-permission android:name="android.permission.VIBRATE" />
    <permission
        android:name="${applicationId}.permission.C2D_MESSAGE"
        android:protectionLevel="signature"/>
    <uses-permission android:name="${applicationId}.permission.C2D_MESSAGE"/>

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:networkSecurityConfig="@xml/network_security_config"
        tools:ignore="GoogleAppIndexingWarning">
        <!-- [START fcm_default_icon] -->
        <!-- Set custom default icon. This is used when no icon is set for incoming notification messages. -->
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_icon"
            android:resource="@drawable/ic_stat_ic_notification" />
        <!-- Set color used with incoming notification messages. This is used when no color is set for the incoming notification message. -->
        <meta-data
            android:name="com.google.firebase.messaging.default_notification_color"
            android:resource="@color/colorAccent" />
        <!-- [END fcm_default_icon] -->
        <!-- [START fcm_disable_auto_init] -->
        <meta-data
            android:name="firebase_messaging_auto_init_enabled"
            android:value="false" />
        <meta-data
            android:name="firebase_analytics_collection_enabled"
            android:value="false" />
        <!-- [END fcm_disable_auto_init] -->
        <activity
            android:name=".EntryChoiceActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- [START firebase_service] -->
        <service
            android:name=".MyFirebaseMessagingService"
            android:exported="false">
            <intent-filter>
                <action android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
        </service>
        <!-- [END firebase_service] -->
    </application>

</manifest>

Access the device registration token

On initial startup of your app, the FCM SDK generates a registration token for the client app instance.

The registration token may change when:

  • The app deletes Instance ID
  • The app is restored on a new device
  • The user uninstalls/reinstall the app
  • The user clears app data.

When you need to retrieve the current token, call FirebaseInstanceId.getInstance().getInstanceId(): For example

private void GetRegistrationToken()
    {
        FirebaseInstanceId.getInstance().getInstanceId()
                .addOnCompleteListener(new OnCompleteListener<InstanceIdResult>() {
                    @Override
                    public void onComplete(@NonNull Task<InstanceIdResult> task) {
                        if (!task.isSuccessful()) {
                            Log.w(TAG, "getInstanceId failed", task.getException());
                            return;
                        }

                        // Get new Instance ID token
                        String token = task.getResult().getToken();
                        regToken = token;
                        System.out.println("***************");
                        System.out.println(token);
                        //
                        // Log and toast
                        String msg = getString(R.string.msg_token_fmt, token);
                        Log.d(TAG, msg);
                        Toast.makeText(MainActivity.this, msg, Toast.LENGTH_SHORT).show();

                        //
                        new Thread(){
                            public void run(){
                                try {
                                    //SEND REGISTRATION TOKEN TO BACKEND SERVER
                                catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                        }.start();
                        //

                    }
                });
    }

As you can see above, after get the registration id you need to pass this to your backend server. In this way you will be able to save this data linking it to your user to permit, in the future, to send message only to selected users.


Android java app with notification from asp.net mvc using firebase cloud messaging – part 2

Android java app with notification from asp.net mvc using firebase cloud messaging – part 3

Links

Posted on

IIS redirect from a site to another site

We must redirect the pages of a site on the pages of another site by changing the main address of the site and keeping the relative addresses of the pages the same. So :

http://blog.mecdata.it/default.aspx will be redirect in https://www.mecdata.it/default.aspx

On our server we need to install an additional IIS module: “HTTP Redirection“.

installing http redirection

in IIS, in your site (in this example blog.mecdata.it) select Http Redirection module and compile it in this way

this configuration will create a web.config file in your site root :

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpRedirect enabled="true" destination="https://www.mecdata.it" exactDestination="false" childOnly="false" />
    </system.webServer>
</configuration>

That’all

more information : https://manage.accuwebhosting.com/knowledgebase/988/How-to-set-website-redirection-from-IIS-7.html

Posted on

Spostare un vecchio sito aspx su un nuovo IIS

Ecco i problemi più comuni che si possono presentare durante lo spostamento di un vecchio sito aspx su nuovo web server Internet Information Server.

APPLICATION POOL

Questo problema lo avrete sicuramente quindi sistemate prima di far partire il sito. Quando create un nuovo sito su IIS questi crea un Application Pool separato per il sito ma lo basa sulla versione 4.0 del Framework .net. La vostra applicazione non funzionerà. Dovete selezionare l’Application Pool e modificare la versione del Framework sulla 2.0. A questo punto fate un Recycle dell’Application Pool e un restart del sito.

PROBLEMI con il defaultDocument

Se vi viene segnalato un problema della definizione della default.aspx sul web.config nel tag

<defaultDocument>
            <files>
                <add value="Default.aspx" />
            </files>
</defaultDocument>

Vi basta inserire prima della dichiarazione add il tag clear, come di seguito :

<defaultDocument>
            <files>
                <clear />
                <add value="Default.aspx" />
            </files>
 </defaultDocument>
Posted on

Sviluppiamo i vostri Software. Concretizziamo le vostre IDEE.

  • Avete diversi software di gestione dati ma non riuscite a Vedere tutti i dati che vi servono, secondo le vostre IDEE e le vostre Regole
  • Utilizzate un foglio di Excel per raccogliere le informazioni ed eseguire i calcoli. L’inserimento dei dati, che tra l’altro possedete già su un altro programma, è lungo e soggetto ad errore umano. Ogni tanto il foglio di Excel vi da degli errori. Non siete sicuri dei dati storici presenti in esso. La manutenzione del foglio di Excel è laboriosa
  • Avete fatto sviluppare una piccola applicazione in Access per vedere meglio le informazioni che vi interessano. Il problema è che potete vederle solo voi perché ogni volta che un vostro collega apre il vostro programma il tutto rallenta mostruosamente
  • Utilizzate in azienda diversi database: Access, Oracle, SqlServer, MySql. Volete vedere i dati contemporaneamente prelevati da diverse fonti , ma i programmi non comunicano tra loro.
  • Avete avuto un IDEA per un software che potrebbe migliorare la vostra attività,la vostra efficienza, il servizio al cliente ma sul mercato non esiste niente del genere, o, se esiste, ha costi improponibili.

Questi sono alcuni dei problemi che abbiamo risolto sviluppando dei software ad Hoc per il cliente.

Abbiamo 10 anni di esperienza nella creazione di applicazioni che scrivono e leggono informazioni dai più importanti Database presenti sul mercato: Access, Oracle, SqlServer, MySql.

Sviluppiamo programmi utilizzando il nuovo ambiente Microsoft .NET. A chi non è “informatico” basti sapere che, sviluppando con un tale metodo, le applicazioni sono compatibili con tutte le odierne e le future versioni di Windows®. Inoltre le applicazioni così prodotte possono essere fruibili attraverso un normale computer e/o attraverso Internet.

Abbiamo affrontato ogni tipo di problema negli anni: i preventivi, la produzione, la contabilità, i trasporti, la fatturazione, le statistiche, le commesse, i tempi degli operatori, i carichi macchina, etc.

Siamo certi di darvi una risposta positiva per ogni esigenza.

Posted on

Creare un sito web statico su Microsoft Azure

Azure offre numerosi web server : .net, asp.net, php, node.

Ma se dovete semplicemente creare una pagina web statica ? Vediamo cosa possiamo fare con Azure.

Il nostro obbiettivo è creare una pagina web statica per il sito www.miosito.com.

La creazione di un sito web statico su Azure si fa attraverso l’account di archiviazione, in particolare con la tipologia Blob.

Creare un account di archiviazione

Il primo passo consiste nel collegarvi alla vostra sottoscrizione Azure e creare un nuovo account di archiviazione.Createlo di tipo Storage V2. Avrete quindi un nuovo Account di archiviazione con il nome, per esempio “mystoragemiosito”.

Creare il sito web statico

Nell’account di archiviazione che avete creato, nella sezione Impostazioni, spingete su “Sito Web Statico”.

Selezionare Abilitato per abilitare l’hosting di siti Web statici per l’account di archiviazione.

Nel campo Nome del documento di indice specificare una pagina di indice predefinita denominata index.html.

Nel campo Percorso del documento di errore specificare una pagina di errore predefinita denominata 404.html (opzionale)

Salvando vi viene proposto l’indirizzo web del vostro sito web statico, qualcosa del tipo :

https://mystoragemiosito.z22.web.core.windows.net/

Create la vostra pagina web index.html con un qualsiasi editor.

Sempre nell’account di archiviazione, spostatevi nella sezione BLOB. L’operazione precedente, cioè la creazione del sito web statico sul Blob, ha creato in automatico il contenitore $web. Entrate dentro il contenitore e caricate il file index.html (pulsante “Carica” in alto).

Ora provate a vedere se tutto funziona : visualizzate l’indirizzo https://mystoragemiosito.z22.web.core.windows.net/ nel vostro browser; vedrete il file index.html.

Creare il collegamento con il sito web esterno (endpoint)

Rimaniamo nella pagina dell’account di Archiviazione. Selezionate “Rete CDN di Azure”. Create un nuovo endpoint.

  • Selezionare come piano tariffario “Akamai standard” (consigliato da microsoft).
  • Come nome Endpoint inserite quello che volete (nel nostro esempio mettiamo miosito).
  • Come nome di host di origine (cancellate quello che vi viene proposto) dovete mettere, l’indirizzo della cartella del blob in cui è il sito web (senza http o https).In pratica è l’indirizzo che prima avete provato con il browser : nel nostro caso “mystoragemiosito.z22.web.core.windows.net”.

Una volta creato il cdn (ci vuole un po di tempo) vi troverete un nuovo indirizzo per poter vedere la vostra pagina index.html: https://miosito.azureedge.net.

Provate anche questo indirizzo con il vostro browser per vedere la pagina index.html

Dentro l’archiviazione da cui siamo partiti per creare la cdn, non vi troverete più la cdn creata e il relativo endpoint : trovate tutto nelle risorse di Azure. Selezionate l’endpoint; nella sezione impostazioni selezionate “Origine”. Se avete fato tutto bene, l’endpoint di tipo “origine personalizzata” (“custom origin”). Il nome host dell’origine dell’archiviazione e l’intestazione dell’origine dell’archiviazione saranno uguali e saranno il nostro sito web sul blob.

Ora dovete fare in modo che il vostro sito web, www.miosito.com, punti a questo endpoint di azure. Per prima cosa dovete lavorare sul DNS nel pannello di controllo di gestione del vostro sito web. Dovete inserire un record di tipo CNAME con nome www che punta a miosito.azureedge.net.

In Azure, cercate nelle risorse il vostro endpoint e spingete sul pulsante per aggiungere il dominio personalizzato :

  • Nome host dell’endpoint : vi viene proposto quello dell’endpoint :  miosito.azureedge.net
  • Nome host personalizzato mettete il vostro indirizzo web. Nel nostro caso www.miosito.com

Fatto questo, dopo un pò di tempo vi si attiverà l’HTTPS.

Ora potete finalmente provare il vostro sito web, digitando nel browser https://www.miosito.com. Vedrete la solita pagina index.html

Attivare HTTP

Se avete seguito il percorso fino a qui forse avete provato che, scrivendo http://www.miosito.com , invece che https, ho un errore. Questo perché l’account di archiviazione di Azure, nasce con il “trasferimento sicuro obbligatorio” attivato. Andate quindi nel vostro account di archiviazione, nella sezione Impostazioni, selezionate “Configurazione”. Nella pagina dovrete disabilitare il “trasferimento sicuro obbligatorio” e salvare. Ora funzionerà anche http://www.miosito.com

Problemi di cache

Questo sistema ha un problema. Se aggiornate la pagina index.html, e visualizzate sul browser l’endpoint di azure oppure il vostro indirizzo esterno, vedrete il contenuto della vecchia pagina index.html. La pagina sarà invece visualizzata nel sua nuova versione se richiamate sul browser il percorso dell’account ai archiviazione web del Blob.

Per ovviare a questo problema ci sono 2 modi. Il primo modo è quello di ripulire la cache dell’endpoint dalla risorsa. Per farlo, nell’endpoint c’è un pulsante “Ripulisci” : questo pulsante vi chiede esattamente la pagina (o la risorsa, immagine,..) che volete “ripulire” e quindi aggiornare.

Un altro modo è fare un aggiornamento delle risorsa cambiandole nome. Nel nostro caso, la mi pagina principale è index.html; carico nel contenitore $web del mio blob una pagina index2.html con il contenuto modificato; vado nella gestione del sito web del blob e modifico la pagina base in index2.html.


Per approfondire

  • Ospitare un sito web statico in archiviazione di Azure : https://docs.microsoft.com/it-it/azure/storage/blobs/storage-blob-static-website-how-to
  • Usare la rete CDN di Azure per abilitare un dominio personalizzato con SSL per un sito Web statico : https://docs.microsoft.com/it-it/azure/storage/blobs/storage-blob-static-website-custom-domain
  • Configurare HTTPS in un dominio personalizzato della rete CDN di Azure : https://docs.microsoft.com/it-it/azure/cdn/cdn-custom-ssl?tabs=option-1-default-enable-https-with-a-cdn-managed-certificate
  • The account being accessed does not support http.with blob sas url in Azure : https://www.itexperience.net/2019/04/20/the-account-being-accessed-does-not-support-http-with-blob-sas-url-in-azure/
Posted on

Testare le Rest API di Azure Storage. Usiamo le Table

azure

Per accedere ad Azure Storage si possono utilizzare le API Rest.

Chiavi SAS

Per avere l’accesso ai file su Azure Storage è necesario creare una chiave SAS, utilizzando il portale di Azure. La chiave SAS è molto utile poiché è sicura, affidabile, facile da usare e può essere impostata a scadere, se necessario.
Al momento, una chiave SAS creata nel portale può essere impostata solo per l’intero account di archiviazione.
Per creare una chiave SAS utilizzando il portale,  l’account Storage e cercare nel menu a sinistra “Firma accesso condiviso“.

Una delle cose su cui fare attenzione è l’orario di accesso alla risorsa he è espresso rispetto alla UTC. Coordinated Universal Time, sulla giornata di “oggi” per 8 ore. Per stare sicuri di poter fare tutte le prove che volete, ovunque voi siate nel mondo, potete impostare un inizio al giorno “ieri” ed una fine al giorno “domani”.

Spingete il pulsante “Genera Firma di Accesso Condiviso”.

Sotto vi compariranno i Token SAS.

Copiate quello relativo alla gestione delle Table.Vi troverete qualcosa del genere :

https://<vostro storage>.table.core.windows.net/?<variabili>

 

Test Azure Storage Table con Postman

Per fare qualche prova, potete scaricare il software Postman.

Copiate la stringa su Postman. Definita la chiave Token, tutte le domande si faranno agendo, per comodità, prima della specifica delle variabili, cioè qui https://<vostro storage>.table.core.windows.net/XXXXXXXX?<variabili>. Vediamo alcuni esempi

Vedo tutti i record di una tabella  : (GET) https://<vostro storage>.table.core.windows.net/tablename()?<variabili>

Vedo un solo Record : (GET) https://<vostro storage>.table.core.windows.net/tablename(PartitionKet=’key1′,RowKey=’Key2′)?<variabili>