638 messaggi dal 18 febbraio 2002
www.dimsolutions.it
Salve a tutti,
qualche tempo fa ho creato un semplice Web API con CORS in GET accessibile da alcuni domini elencati.


Il servizio funziona ma mi sono accorto che facendo chiamate ravvicinate, per esempio invocando il servizio da dominio1 con con jquery la prima chiamata funziona, la seconda chiamata da dominio2 non riesce ad ottenere il json di risposta. Se elimino il thread in esecuzione dal server la chiamata da dominio2 è ok.. praticamente una volta che il thread parte sembra accettare solo la prima chiamata.

A cosa può essere dovuta questa cosa?

Ecco l'intestazione di CORS:
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
    public class MyCorsPolicy : Attribute, ICorsPolicyProvider
    {


grazie

Telesoccorso Lineaperta: Servizi di Telesoccorso
10.966 messaggi dal 09 febbraio 2002
Contributi
Ciao,
spiega bene cosa intendi con "non riesce ad ottenere il json di risposta".
La seconda richiesta per caso rimane appesa e il server non restituisce mai la risposta?


Se elimino il thread in esecuzione dal server la chiamata da dominio2 è ok..

Per caso si sta verificando un deadlock da qualche parte?
http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html

ciao,
Moreno
Modificato da BrightSoul il 12 dicembre 2017 18.57 -

Enjoy learning and just keep making
638 messaggi dal 18 febbraio 2002
www.dimsolutions.it
BrightSoul ha scritto:

Per caso si sta verificando un deadlock da qualche parte?
http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html


Forse, ma non riesco bene a capire.
Posto il codice perchè alla fine è veramente poco:

Questa la chiamata Client:

  $(document).ready(function () {
    $.ajax({   
      url: 'http://xxxxxx.com/api/service/1',   
      type: 'GET',
      contentType: "application/json; charset=utf-8",
      async: true,
      dataType: "json",   
      success: function (data) {   
         
        var datavalue = data;   
        var myJsonObject = datavalue;   
        
        var scadenza = myJsonObject[0].Expire;        
        // alert(scadenza);
        $('#licenza').text('Scadenza Licenza: ' + scadenza);
      },   
      error: function (xhr) {   
        //alert(xhr.responseText);
        $('#licenza').text('Impossibile Recuperare Licenza: ' + xhr.responseText);
      }   
    });
  });


Questo il codice sul controller della WebAPI:

  // GET api/service/5        
  [HttpGet]
  [MyCorsPolicy]
  public IEnumerable<cServiceCustomer> Get(int id)
  {
    List<cServiceCustomer> li = new List<cServiceCustomer>();            

    cServiceCustomer myService = new cServiceCustomer(id);
    li.Add(myService);
    return li;
  }  
  
  
    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)]
    public class MyCorsPolicy : Attribute, ICorsPolicyProvider
    {
        private CorsPolicy _policy;

        public MyCorsPolicy()
        {
            // Create a CORS policy.
            _policy = new CorsPolicy
            {
                AllowAnyMethod = true,
                AllowAnyHeader = true
            };

            cURL myURLAccess = new cURL();
            List<string> aURLOrigins = myURLAccess.aUrlAccess; // URL di Accesso Personalizzate a livello Globale della WebAPI

            for (int i = 0; i < aURLOrigins.Count; i++)
            {
                // Add allowed origins.
                string url = aURLOrigins[i].ToString();
                //string url = "http://" + aURLOrigins[i].ToString();
                _policy.Origins.Add(url);
            }
        }

        public Task<CorsPolicy> GetCorsPolicyAsync(HttpRequestMessage request, System.Threading.CancellationToken token)
        {
            return Task.FromResult(_policy);
        }
    }

Modificato da diego78 il 13 dicembre 2017 12.06 -

Telesoccorso Lineaperta: Servizi di Telesoccorso
10.966 messaggi dal 09 febbraio 2002
Contributi
Ciao Diego,
qui mi sembra che non ci sia nulla che possa giustificare il problema.


// URL di Accesso Personalizzate a livello Globale

Gli URL come li otteni? Li estrai dal database?
Posta anche quel pezzo di codice.

ciao,
Moreno

Enjoy learning and just keep making
638 messaggi dal 18 febbraio 2002
www.dimsolutions.it

Gli URL come li otteni? Li estrai dal database?
Posta anche quel pezzo di codice.


    public class cURL
    {
        public List<string> aUrlAccess { get; set; }

        private readonly database _database = new database();

        protected database db
        {
            get { return _database; }
        }

        // Costruttore
        public cURL()
        {
            aUrlAccess = getURLAccess();

            if (aUrlAccess.Count <= 0)
            {
                // Nessun record Scrivo Log
                log.CreateLogFiles();
                log.ErrorLog("Errore non previsto: cURL Descrizione: Nessun Record Trovato.");
            }
        }

        //---------------------------------------------------------------
        // RICAVA URL DI ACCESSO AL WEB SERVICE
        // Input: 
        // Output: List<string>
        //---------------------------------------------------------------
        private List<string> getURLAccess()
        {
            string sSql = "SELECT DISTINCT url " +
                          "FROM clienti_servizi " +
                          "WHERE url IS NOT NULL";

            List<string> aReturn = db.executeSQLDataReader(sSql);
            return aReturn;
        } 

    }

Telesoccorso Lineaperta: Servizi di Telesoccorso
10.966 messaggi dal 09 febbraio 2002
Contributi
Ciao Diego,
hai verificato se la query select che usi per recuperare gli url viene eseguita ad ogni richiesta? Se sì, prova a cachare il risultato in memoria e a vedere se così la situazione migliora.

Non riesco ancora a capire se il problema può effettivamente dipendere da un deadlock. L'effettiva interrogazione al database è incapsulata nel metodo db.executeSQLDataReader. Usi operazioni asincrone al suo interno? Magari ne attendi il completamento usando .Wait o .Result?

Apri/chiudi le connessioni regolarmente? Non è che magari ti si riempie il connection pool a causa di connessioni non chiuse?

ciao,
Moreno

Enjoy learning and just keep making
638 messaggi dal 18 febbraio 2002
www.dimsolutions.it
BrightSoul ha scritto:
Ciao Diego,
hai verificato se la query select che usi per recuperare gli url viene eseguita ad ogni richiesta? Se sì, prova a cachare il risultato in memoria e a vedere se così la situazione migliora.


Non so dovrei fare delle prove.


Non riesco ancora a capire se il problema può effettivamente dipendere da un deadlock. L'effettiva interrogazione al database è incapsulata nel metodo db.executeSQLDataReader. Usi operazioni asincrone al suo interno? Magari ne attendi il completamento usando .Wait o .Result?


No, non uso metodi Async o Wait


Apri/chiudi le connessioni regolarmente? Non è che magari ti si riempie il connection pool a causa di connessioni non chiuse?


Si, chiuse regoloarmente.

Aggiorno il POST non appena riesco a fare queste prove

Telesoccorso Lineaperta: Servizi di Telesoccorso

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.