29 messaggi dal 24 marzo 2008
Buongiorno ragazzi,
vi scrivo per chiedervi aiuto su un problema.
Ho un'applicazione web realizzata utilizzando la versione 3.5 del framework .NET.
Funziona tutto correttamente, salvo che per una query che interroga un campo float recuperando tutti i record <= 0,01.

Ecco lo script che entity framework invia al db

WHERE [Coefficiente] <= cast(0.01 as float(53))

Se viene eseguita ritorna sempre tutti i record della tabella, senza applicare alcun filtro.

ho provato ad esplicitare nel web.config la cultura per l'applicazione

<globalization requestEncoding="latin9" responseEncoding="latin9" culture="it-IT" uiCulture="it-IT" />

ma purtroppo continua a non funzionare.

Vi aggiorno sulla situazione:
Ho fatto ulteriori prove ed ho riscontrato che importando le classi entity framework in una nuova web application funziona tutto correttamente. A questo punto l'unica differenza con quella non funzionante è che quest'ultima utilizza entity framework attraverso un webservice.

Grazie in anticipo per qualsiasi informazione utile
Modificato da dadox77 il 21 novembre 2011 12.08 -
Modificato da dadox77 il 28 novembre 2011 11.45 -

Nulla è reale...tutto è lecito...
29 messaggi dal 24 marzo 2008
Vi aggiorno sugli ultimi sviluppi.
Inizialmente pensavo di aver risolto poichè il codice effettuava una replace da punto a virgola indipendentemente dalla cultura in uso.

Ho sostituito tale replace con il separatore impostato nella cultura con cui gira il thread (
Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator) e tutto funzionava correttamente.

Ieri ho provato ad accedere da casa ed il problema si è ripresentato. Dopo un'analisi ho riscontrato che la webapp faceva una replace da punto a virgola, mentre accedendo da uno dei pc del mio istituto (l'applicazione risiede in uno dei nostri server) la replace è da virgola a punto (corretta per il funzionamento).

L'applicazione non ha la globalizzazione con culture auto e non prende i setting del browser dell'utente.

La mia ipotesi è che, accedendo dall'esterno della rete istituzionale, la cultura risenta delle impostazioni dell'utente anonimo asp.net con cui si fruisce l'applicazione.

L'unica soluzione che mi viene in mente è di esplicitare la cultura a livello di web.config

<globalization culture="en-US" />

Pensate che la mia analisi sia corretta?

Grazie come sempre in anticipo per tutti i suggerimenti
Modificato da dadox77 il 03 dicembre 2011 18.55 -
Modificato da dadox77 il 03 dicembre 2011 18.58 -

Nulla è reale...tutto è lecito...
5.610 messaggi dal 09 febbraio 2002
Contributi
Ciao,
facendo dei replace da punto a virgola (o viceversa) secondo me si corre il rischio di fare confusione col separatore delle migliaia, nel caso in cui l'utente possa digitare numeri maggiori di 1000.

Il metodo float.Parse() ha un overload che accetta come parametro anche la culture di riferimento. Quindi potresti fare:

var numero = float.Parse(valoreCheArrivaDalForm, System.Threading.Thread.CurrentThread.CurrentCulture);
Così il parsing verrà effettuato in accordo con la Culture dell'utente.
Anche se questo sistema, di per sé, non è che sia risolutivo... che succede infatti se il browser impone una culture en-US ma l'utente di fatto è italiano ed è abituato a separare i decimali con la virgola? Succede che probabilmente il parsing darà risultati inaspettati, come del resto stai già sperimentando.

Allora dovresti impedire all'utente di usare i separatori a casaccio, magari legando la textbox ad un RegularExpressionValidator la cui espressione sarà generata dinamicamente in base alla Culture corrente. Qui trovi un esempio su come generare l'espressione.
http://stackoverflow.com/questions/1438333/regular-expression-to-validate-numeric-values#answer-1438337

Così validi il numero e lo parsi usando la stessa Culture, qualunque essa sia.

ciao

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
29 messaggi dal 24 marzo 2008
Ciao BrightSoul, grazie come sempre della risposta esaustiva.
Il problema iniziale era su due radiobutton in cui erano "scolpiti" value con virgola. Ho quindi sostituito i valori hardcoded con questo codice (un radiobutton cerca valori fino a 0,01 mentre l'altra fino a 0,05):

String.Format("0{0}01", System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator);

String.Format("0{0}05", System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator);


Ho pensato poi di estendere tale idea anche sulla sostituzione del decimale su una textbox in questo modo:

txtValore.Text = txtValore.Text.Replace(".", System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator);

txtValore.Text = txtValore.Text.Replace(",", System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator);


Quello che non capisco è la differenza nel separatore restituito dalla funzione System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator.

Ho fatto un test con un collega ed ho riscontrato che nel suo caso il separatore era "." mentre per me era ",". L'unica differenza è che lui accedeva dal nostro istituto, quindi tramite una macchina della nostra rete (la webapp risiede sul nostro server web), mentre io lavoravo dal mio pc a casa.

Le impostazioni internazionali tra i nostri due pc e dei nostri rispettivi browser sono identiche (italiano in entrambi i casi).

Non potendo intervenire sulle impostazioni a livello di server ho pensato di risolvere il problema imponendo la cultura a livello di web.config (l'applicazione per funzionare correttamente ha necessità del punto come separatore decimale) inserendo

<globalization culture="en-US" />

Non è una soluzione particolarmente elegante ma mi permetterebbe di avere sempre il separatore giusto.

Spero che queste informazioni rendano più chiaro il problema e ti ringrazio come sempre per i preziosi suggerimenti
Modificato da dadox77 il 04 dicembre 2011 21.15 -

Nulla è reale...tutto è lecito...
5.610 messaggi dal 09 febbraio 2002
Contributi

Ho fatto un test con un collega ed ho riscontrato che nel suo caso il separatore era "." mentre per me era ",".


ciao, se la culture è impostata su auto, asp.net la determinerà in base alle preferenze sulla lingua del browser, che vengono comunicate al server tramite l'intestazione "Accept-Language". Probabilmente il tuo browser invia una cosa diversa dal suo... Non credo che la presenza del client in rete locale o in internet sia influente.
Infatti, se con un reflector vai ad ispezionare il codice di Page.Culture, vedrai che alla fine viene scelta in base al valore di Request.UserLanguages, che è una collezione che riflette i valori inviati con l'intestazione "Accept-Language".

Stampa nella pagina il valore di Request.UserLanguages[0] e vedrai che il tuo valore non sarà identico al suo.


Il problema iniziale era su due radiobutton in cui erano "scolpiti" value con virgola.

ok, se lo imposti tu poi è facile parsare il valore perché sai esattamente quale separatore hai usato. In questo caso non è necessario scegliere un separatore in base alla culture dell'utente, puoi benissimo continuare ad usare il punto purché poi utilizzi l'overload di float.Parse che accetta una culture tipo en-Us (o CultureInfo.InvariantCulture).

Il problema nasce quando l'utente ha facoltà di inserire del testo libero nelle textbox perché, specie se hai un pubblico internazionale, non puoi sapere a priori quale separatore è abituato ad utilizzare.

Devi necessariamente controllare il valore immesso nelle textbox affinché sia valido secondo la culture dell'utente, oppure puoi obbligarlo ad usare un separatore scelto da te (es. il punto). Infatti hai optato per questa seconda soluzione, impostando per tutti gli utenti la culture en-US.

Ora però bisogna fare in modo che gli utenti italiani si adeguino a questa convenzione. Ad esempio inibisci la digitazione della virgola col javascript, oppure a scanso di equivoci crea due textbox: una per inserire la parte intera e una per la parte decimale del numero. Queste due non sono granché come soluzioni ma serviranno ad evitare la confusione che potrebbe sorgere nell'utente che è abituato ad usare la virgola come separatore di decimali.

Ad ogni modo fai sempre validazione server side usando un RegularExpressionValidator.

ciao,

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
29 messaggi dal 24 marzo 2008
Ciao Bright,




Il problema iniziale era su due radiobutton in cui erano "scolpiti" value con virgola.



ok, se lo imposti tu poi è facile parsare il valore perché sai esattamente quale separatore hai usato. In questo caso non è necessario scegliere un separatore in base alla culture dell'utente, puoi benissimo continuare ad usare il punto purché poi utilizzi l'overload di float.Parse che accetta una culture tipo en-Us (o CultureInfo.InvariantCulture).


Ho optato per questa soluzione per mantenere un pò di flessibilità anche per questi valori "fissi", in modo da poter eventualmente lavorare da web.config senza mettere mano al codice.



Il problema nasce quando l'utente ha facoltà di inserire del testo libero nelle textbox perché, specie se hai un pubblico internazionale, non puoi sapere a priori quale separatore è abituato ad utilizzare.

Devi necessariamente controllare il valore immesso nelle textbox affinché sia valido secondo la culture dell'utente, oppure puoi obbligarlo ad usare un separatore scelto da te (es. il punto). Infatti hai optato per questa seconda soluzione, impostando per tutti gli utenti la culture en-US.



Come ti dicevo, il nostro pubblico è esclusivamente nazionale. Attualmente l'applicazione, oltre alla replace che sai, implementa un Double.TryParse senza specifica della cultura, che prende quindi quella corrente.

Purtroppo stanno venendo fuori altri problemi inattesi. Il più serio è un malfunzionamento delle stampe (viene utilizzato crystal reports) che però si riscontra sempre accedendo da client via internet (in intranet tutto funziona perfettamente). Nel primo caso l'applicazione non riesce a caricare gli assembly necessari (anche se installati sul server di produzione tramite il crystal report redistributable pack) e produce un errore del tipo "could not load assembly..." causato da un'eccezione di tipo FileNotFound.

Sto iniziando a pensare che forse varrebbe la pena effettuare qualche indagine a livello sistemistico, piuttosto che applicativo, ma purtroppo non saprei da dove iniziare, non avendo competenze specifiche in merito. L'unica cosa che mi viene in mente è che l'utente ASPNET abbia qualche restrizione di accesso alle cartelle di sistema del server (Windows 2003 Server)

Tu hai qualche idea in merito?

Grazie come sempre

Nulla è reale...tutto è lecito...
5.610 messaggi dal 09 febbraio 2002
Contributi
ciao,

dadox77 ha scritto:

si riscontra sempre accedendo da client via internet (in intranet tutto funziona perfettamente)


è lo stesso server che risponde ad entrambi i tipi di richieste, giusto? E' strano che si comporti in maniera così differente quando ci si collega da internet, addirittura da mandare in errore il caricamento degli assembly di Crystal Reports.

Non è che per caso nell'IIS del server sono configurati 2 siti, uno che risponde se lo si raggiunge dall'ip pubblico e l'altro dall'ip di rete locale? Se hai possibilità di accedere al server, apri la console di IIS6 e controlla quanti siti sono configurati in esso. Per ciascuno, annota quali sono i "Binding" e le cartelle fisiche a cui puntano.
Se ci sono due siti che puntano alla stessa cartella fisica, possono avere configurazioni diverse (trattandosi windows server 2003) e quindi comportarsi in maniera diversa...

ciao

- So what you're saying is, if we get in trouble, there's no one to help us out?
- I'm afraid not.
- Fantastic!
29 messaggi dal 24 marzo 2008
Ciao Bright,
scusa se non mi sono più fatto sentire ma fortunatamente ti scrivo per darti buone notizie...abbiamo risolto il problema!!! :)

In sostanza si trattava di un problema di puntamento del DNS che, dall'esterno, puntava ancora al server web 2 su cui era stata spostata temporaneamente l'applicazione per ovviare ad alcuni problemi di sovraccarico su server web 1.

Effettivamente era alquanto strano che non venissero recepiti gli aggiornamenti "da fuori" (perchè ovviamente server web 2 non veniva mai aggiornato in quanto le patch erano passate solo su 1), ed era ancora più strano il discorso delle stampe (causate dal fatto che il redistributable pack di crystal reports era stato installato solo su server 1)

Ci servirà sicuramente come esperienza per il futuro, nel frattempo ti ringrazio ancora tantissimo per il supporto ed i suggerimenti e ti auguro fin da ora di passare delle serene festività.

A presto :)

Nulla è reale...tutto è lecito...

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.
Community
Ultimi messaggi
UTENTI ONLINE
In primo piano

I più letti di oggi

Media
In evidenza
MISC