[ASP.NET] Bizarrerie avec les URL (ne correspondent pas !)

Bizarrerie avec les URL (ne correspondent pas !) [ASP.NET] - ASP - Programmation

Marsh Posté le 05-07-2017 à 19:33:42    

:hello:  
 
 
J'ai une question toute bête...  
A la base, j'ai créé une appli en C# pour une utilisation familiale. Puis, je me suis mis à l'ASP.Net (que je ne connaissais pas) pour donner la possibilité aux utilisateurs d'encoder des données sur une page web et de me les transmettre (insertion dans la DB). Jusque là, tout va bien !  :)  
 
Il y a un truc qui me chifonne, c'est que lorsque je navigue de page en page, l'URL dans la barre d'adresse ne correspond pas à la page en cours mais bien à celle dont je proviens... Bizarre, non ?
 
Que puis-je faire pour corriger cela ?
 
 
NB : j'utilise ce code pour charger une page depuis une autre :  
 

Code :
  1. Server.Transfer("WebForm2.aspx" );


 
 
Merci !  :jap:


Message édité par mikekine le 05-07-2017 à 19:34:17

---------------
Topic Blindtest
Reply

Marsh Posté le 05-07-2017 à 19:33:42   

Reply

Marsh Posté le 05-07-2017 à 21:01:55    

J'ai une autre question pour un comportement bizarre... :heink:  
 
 
Dans une webform (page 1), les users encodent des données puis valident avec un clic sur un bouton; ils arrivent à la page 2. Si à ce moment je clique sur le bouton back de mon navigateur (reviens page 1), puis clique sur avant (retour page 2), il y a un "nouveau submit" des données encodées à la page 1.
 
J'ai pourtant pris soin d'inclure ce code dans le page_load :
 

Code :
  1. Response.Cache.SetCacheability(HttpCacheability.NoCache);
  2. Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
  3. Response.Cache.SetNoStore();
  4. Response.AppendHeader("Pragma", "no-cache" );


 
Comment est-ce possible ?  
 
 
Edit :
 
Bon, je viens de tester en vidant complètement le cache et le problème persiste... Le cache n'est donc pas en cause ! Là, je vois plus ce que je peux faire...  :(


Message édité par mikekine le 05-07-2017 à 21:17:10

---------------
Topic Blindtest
Reply

Marsh Posté le 06-07-2017 à 08:34:07    

Hello,  
 
- Pour le premier problème c'est facile, Server.Transfer() sert à faire EXACTEMENT ce que tu décris : ne pas toucher à l'url côté client, mais côté serveur charger l'adresse spécifiée à la méthode. C'est utilisé pour faire des espèces de "redirections masquées", et absolument pas pour la navigation normale de ton utilisateur.
A la place tu dois utiliser Response.Redirect().  
Je te laisse chercher pour mieux comprendre les deux méthodes.
Le mieux étant encore de laisser la navigation se faire côté client, quand c'est possible bien sûr.
 
- Concernant le deuxième problème le cache n'a rien à voir là dedans et ne sert pas du tout à ça.  
envoies des formulaires en faisant des postback, ton navigateur émet un POST, un appel d'url avec de la transmission d'info en plus. Quand tu reviens en arrière et repart en avant dans le navigateur il va refaire la même action : renvoyer les même infos.
Ca n'est pas spécifique à .Net ou à ton site, c'est comme ça qu'internet fonctionne. Et la plupart des navigateurs empêchent ça (parce que 99% du temps c'est indésirable), en t'affichant lorsque tu utilises les touches back/forward des avertissements du genre "attention, vous êtes sur le point de renvoyer des données déjà envoyées, êtes vous sûr" ou bien en t'affichant une page du genre "les données sur cette page sont périmées".  
Il ne faut pas utiliser le navigateur pour faire avant/arrière, le site doit proposer une logique de navigation qui permet d'éviter ça à l'utilisateur.
 


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 06-07-2017 à 10:24:05    

Tout d'abord, merci de m'avoir répondu !  ;)  
 
 
1er problème :
 
J'ai utilisé Server.transfer() car j'ai lu sur le net que c'était la bonne manière pour créer et utiliser des variables de session (par ex : transmission du login de page en page).  
 
Ex:  

Code :
  1. Session.Add("Dplid", dplid);
  2. Server.Transfer("WebForm2.aspx" );


Est-ce que Response.redirect() fait la même chose ?  :??:  
 
 
2ème problème :
 
Oui, j'avais déjà entendu parler de ce fameux postback. Et effectivement, j'ai bien une alerte du navigateur :
 
https://img4.hostingpics.net/pics/481720333.png
 
En fait, quand je programme, j'imagine toujours tous les cas possibles (et donc, cet aller-retour en arrière)... vu que les users peuvent faire nawak...  :o  
Est-ce que le postback pourrait solutionner cela ? Ou bien, je ne dois pas trop m'en inquiéter selon toi...


---------------
Topic Blindtest
Reply

Marsh Posté le 06-07-2017 à 10:27:36    

Server.Transfer et la gestion des sessions ça n'a rien à voir, je ne sais pas quel tuto tu as suivi mais si le mec a écrit ça je serai toi j'irai voir ailleurs.

 

C'est bien la page dont je parlais, tu vois ton navigateur sait que tu fais un truc mal. Des postback tu en fais déjà, ça n'est pas la solution. Et non, il n'y a pas de vraie solution super simple, c'est le web qui fonctionne comme ça "par design" comme je te disais :o.

 

Creuse un peu pour mieux comprendre tout ça, je pense que quelques concepts fondamentaux t'échappent un peu et te font partir dans des mauvais raisonnements [:spamafote]


Message édité par TotalRecall le 06-07-2017 à 10:29:09

---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 06-07-2017 à 13:06:11    

Bon bon bon... Me voilà tout désappointé ... [:tinostar]
 
Si jamais tu as sous le coude de bonnes adresses de tutoriaux valables, n'hésite pas !  ;)


Message édité par mikekine le 06-07-2017 à 13:06:49

---------------
Topic Blindtest
Reply

Marsh Posté le 06-07-2017 à 14:15:25    

Pas du tout désolé. Pour ma part c'est plutôt beaucoup d'années de pratique [:spamafote]


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 06-07-2017 à 14:35:45    

Ok, je vais plancher sur Response.Redirect()...  :jap:  
Mais je suis quand même curieux ( :D ); à quoi sert Server.transfer() alors ?


---------------
Topic Blindtest
Reply

Marsh Posté le 06-07-2017 à 14:41:01    

Je l'ai dit, et sinon demande à google. Pas besoin de se taper les pages imbitables de la MSDN, il suffit de taper "Server.Transfer vs Response.Redirect", t'auras 15 liens stack overflow avec la même question, et même la en français : https://www.developpez.net/forums/d [...] -redirect/ [:spamafote]


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 06-07-2017 à 14:52:04    

TotalRecall a écrit :

Je l'ai dit, et sinon demande à google. Pas besoin de se taper les pages imbitables de la MSDN, il suffit de taper "Server.Transfer vs Response.Redirect", t'auras 15 liens stack overflow avec la même question, et même la en français : https://www.developpez.net/forums/d [...] -redirect/ [:spamafote]


 
Justement, c'est en me baladant sur Stack Overflow que j'ai vu qu'on conseillait Server.Transfer (pour l'utilisation de variable de session). Donc, je me méfie maintenant ! :D
En plus, hier, à force de rechercher sur Google, on m'a dit (Google) que le trafic était très (trop ?) important et que je devais passer par captcha (dont le service était en panne  :pfff: )...  
 
Bref, je m'y replonge; merci pour ton attention !  ;)


---------------
Topic Blindtest
Reply

Marsh Posté le 06-07-2017 à 14:52:04   

Reply

Marsh Posté le 06-07-2017 à 14:58:18    

T'as qu'à pas aller sur Internet depuis ta COGIP pendant les heures de boulot :o


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 06-07-2017 à 18:19:04    

J'ai donc changé mon fusil d'épaule et suis reparti sur Response.Redirect(). Ca fonctionne bien !  
 
Mais je désire encrypter les querystring (pour le principe :o ).
 
J'ai repéré sur le net ceci : QueryStringModule.
 
J'ai ajouté comme préconisé le fichier *.cs dans le dossier App_code de mon projet. J'ai également modifié le contenu du fichier Web.config.
 
Voici ce que donne l'explorateur de solution de VS2017 :
 
https://img4.hostingpics.net/pics/564326333.png
 
 
Et pourtant, ceci donne une erreur :
 

Code :
  1. string query = QueryStringModule.Encrypt("blabla" );


 
QueryStringModule n'est pas reconnu !  :sweat:  
 
 
Qu'ai-je bien pu faire comme erreur ?  :??:


---------------
Topic Blindtest
Reply

Marsh Posté le 06-07-2017 à 18:32:45    

C'est où que ça n'est pas reconnu, dans les vues ? Le Code Behind ?
 
C'est une web application ton truc, un web site ? Utiliser l'App_Code ça fait un peu méthode de la préhistoire, surtout que je vois que tu as des librairies à côté. A mon avis tu ferais mieux de foutre ta classe dans une de ces librairies.
 
Ton truc vu son nom c'est un HttpModule ? Si oui, il faut être super vigilant quand tu le références dans le Web.Config, si tu te loupes un tout petit peu sur le nom de la classe, le namespace, l'assembly ou n'importe quoi il sera invisible.
 


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 06-07-2017 à 19:17:39    

TotalRecall a écrit :

C'est où que ça n'est pas reconnu, dans les vues ? Le Code Behind ?


Oui, dans le code behind !  
 

TotalRecall a écrit :

C'est une web application ton truc, un web site ?


 
J'ai trouvé ça à plusieurs endroits, dont celui-ci : https://madskristensen.net/post/htt [...] encryption
 

TotalRecall a écrit :

Utiliser l'App_Code ça fait un peu méthode de la préhistoire, surtout que je vois que tu as des librairies à côté. A mon avis tu ferais mieux de foutre ta classe dans une de ces librairies.


Oui, c'est ce que je me suis dit aussi... Mais bon, quand on connaît pas, on suit les instructions :D
 

TotalRecall a écrit :

Ton truc vu son nom c'est un HttpModule ? Si oui, il faut être super vigilant quand tu le références dans le Web.Config, si tu te loupes un tout petit peu sur le nom de la classe, le namespace, l'assembly ou n'importe quoi il sera invisible.


 
J'ai rajouté ceci dans <System.web> du fichier Web.config :
 

Code :
  1. <httpModules>
  2. <add type = " QueryStringModule " name = " QueryStringModule " />
  3. </httpModules>


 
Voilà pour les explications !  :jap:


Message édité par mikekine le 06-07-2017 à 19:18:25

---------------
Topic Blindtest
Reply

Marsh Posté le 06-07-2017 à 19:29:31    

C'est bon, j'ai fait comme tu me l'as recommandé; j'ai créé un dossier et ajouté celui-ci dans le projet web dans l'explorateur de solution !
 
C'était tout bête (comme bien souvent)... [:petrus75]


---------------
Topic Blindtest
Reply

Marsh Posté le 06-07-2017 à 20:57:19    

J'ai crié victoire trop vite; y'a un binz pendant la phase de decryptage   :o  
 
Message d'erreur :  
 

Citation :

System.FormatException : 'L'entrée n'est pas une chaîne Base 64 valide, car elle contient un caractère non-Base 64, plus de deux caractères de remplissage ou un caractère non conforme parmi les caractères de remplissage. '


 
Voici un bête exemple de cryptage/décryptage :
 

Code :
  1. String equery = QueryStringModule.Encrypt("ABC" );
  2. System.Diagnostics.Debug.WriteLine(QueryStringModule.Decrypt(equery));


 
 
Pour info, voilà la fonction complète de décryptage
L'instruction qui provoque l'erreur est en ligne 4 :
 

Code :
  1. public static string Decrypt(string inputText)
  2.   {
  3.     RijndaelManaged rijndaelCipher = new RijndaelManaged();
  4.     byte[] encryptedData = Convert.FromBase64String(inputText);
  5.     PasswordDeriveBytes secretKey = new PasswordDeriveBytes(ENCRYPTION_KEY, SALT);
  6.     using (ICryptoTransform decryptor = rijndaelCipher.CreateDecryptor(secretKey.GetBytes(32), secretKey.GetBytes(16)))
  7.     {
  8.       using (MemoryStream memoryStream = new MemoryStream(encryptedData))
  9.       {
  10.         using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
  11.         {
  12.           byte[] plainText = new byte[encryptedData.Length];
  13.           int decryptedCount = cryptoStream.Read(plainText, 0, plainText.Length);
  14.           return Encoding.Unicode.GetString(plainText, 0, decryptedCount);
  15.         }
  16.       }
  17.     }
  18.   }


 
Ou je m'y prends comme un manche ou y'a une erreur dans leur code... [:gratgrat]
 
 
EDIT : C'est bon, j'ai trouvé; c'était une mauvaise manipulation de ma part  :whistle:


Message édité par mikekine le 07-07-2017 à 16:17:00

---------------
Topic Blindtest
Reply

Marsh Posté le 07-07-2017 à 16:16:41    

Re,  :hello:  
 
 
J'ai une p'tite question !  
 
Lorsque j'écris ceci :
 

Code :
  1. protected void Button2_Click(object sender, EventArgs e) {
  2. ...
  3. if (TextBox1.Text == "" || TextBox2.Text == "" || canConvert == false || i > 28 || i < 1) {
  4. Label7.Visible = true;               
  5. Thread.Sleep(3000);
  6. Response.Redirect("Webform2.aspx?Intitule=" + dplintitule + "&Id=" + dplid.ToString());
  7. ...
  8. }
  9. }


 
-> Label7 étant un message pour l'utilisateur qui ne s'affiche qu'en cas de mauvais encodage.
 
En gros, je voudrais qu'en cas de mauvais encodage, un message s'affiche pendant 3 secondes, puis qu'une nouvelle page soit chargée !
Mais le fait est que Label7 ne s'affiche pas; si je supprime le chargement d'une nouvelle page, alors, là, le message du Label7 s'affiche ! J'ai l'impression qu'il faut que l'on soit sorti du code du Button2_Click pour que la mise à jour de la page web se fasse...
 
Est-ce normal ?  :??:
 
 
EDIT :
 
Je viens de remarquer que c'est valable pour tout code; ici par exemple, j'ai introduit du code javascript qui doit envoyer à l'écran une boite de message. Ben, en fait, si elle est suivie par une redirection de page, elle n'apparaît pas !
 

Code :
  1. if (TextBox1.Text == "" || TextBox2.Text == "" || canConvert == false || i > 28 || i < 1)
  2.             {                               
  3.                 ClientScriptManager cs = Page.ClientScript;
  4.                 Type csType = this.GetType();
  5.                 cs.RegisterStartupScript(csType, "Attention", "<script language=JavaScript>window.alert('Merci de remplir les 3 champs correctement !');</script>" );
  6.                 Response.Redirect("Webform2.aspx?Intitule=" + dplintitule + "&Id=" + dplid.ToString());
  7.             }


 
Comment est-ce possible ???


Message édité par mikekine le 07-07-2017 à 17:59:14

---------------
Topic Blindtest
Reply

Marsh Posté le 07-07-2017 à 20:54:33    

Hello,
 
C'est tout à fait normal.
 
Response.Redirect envoi une entête de redirection au client.  La réponse ne contient en réalité aucun code html
En gros, cela indique juste au navigateur de charger une autre page sans rien faire d'autre.
 

Citation :

ASP.NET performs the redirection by returning a 302 HTTP status code.
https://msdn.microsoft.com/en-us/li [...] .110).aspx

 
 
 
Il faut bien comprendre que le web fonctionne en mode client/serveur.
Le client c'est ton navigateur. Le serveur c'est ton site web.
Le code que tu écris n'est exécuté que côté serveur. Ce qui veut dire que Thread.Sleep va bloquer la page pendant 3s avant de renvoyer la réponse à ton navigateur.  
Donc à ne jamais utiliser
 
Si tu veux effectuer une redirection code côté client, tu as 2 solutions:
- tu ajoutes une balise meta dans la balise head de ton code html
<meta http-equiv="refresh" content="3; URL='http://manouvelleadresse'" /> (content correspond au délai avant redirection en s)
https://weblog.west-wind.com/posts/ [...] fresh-Tags
 
- tu renvois du javascript qui va faire un redirect côté client
un truc du genre:   setTimeout(function() { window.location = "http://manouvelleadresse"; }, 3000); (écrit à la va vite, donc pas taper si ça marche pas)
 
 
PS:  
Celà dit, Etant donné que tu débutes en asp.net webforms, je ne suis pas sur qu'en 2017 ce soit vraiment la meilleur techno à apprendre.
webforms c'est quand même une grosse grosse boite noire et c'est très difficile de dévier de son fonctionnement.  
 
Si tu n'as pas encore trop avancé dans ton projet je te conseillerais plutôt de partir sur du Asp.net mvc.
C'est une techno beaucoup plus "standard" (ie. tu vas coder du html pour la partie rendue) et ça te permettra plus facilement de comprendre comment fonctionne le web. (notamment les notions de get/post/put)
Et surtout les connaissances que tu vas apprendre seront transposables assez facilement dans d'autres languages. (Php, Ruby, etc..)
 
Ps2:  
tu peux prendre les articles de Mads Kristesen comme paroles d’évangile.
Monsieur bosse pour Microsoft et est l'auteur des excellentes extensions "web essentials" pour visual studio.
 
Bon courage pour la suite.  :hello:


Message édité par leujuiphe le 07-07-2017 à 20:59:44

---------------
"Je ne suis pas con, je fais de la rétention d'intelligence, Nuance" Philippe Geluck. ---- Ils sont chauves mes smileys
Reply

Marsh Posté le 08-07-2017 à 11:56:56    

Merci pour ton aide !  :)  
 
Mais en fait, ça ne m'aide pas trop. :/
 
Donc, comme je disais dans mon post ci-dessus, je désirerais qu'un message apparaisse pendant 3 secondes sur la page web (en gros, le Label7 devienne visible) quand la saisie des champs du formulaire n'est pas correcte, puis ensuite que la page redirige vers une nouvelle. Pour le moment, j'ai ceci :
 

Code :
  1. protected void Button2_Click(object sender, EventArgs e)
  2.         {
  3.             Double i = 0;
  4.             bool canConvert = Double.TryParse(TextBox3.Text, out i);
  5.             if (TextBox1.Text == "" || TextBox2.Text == "" || canConvert == false || i > 28 || i < 1)
  6.             {
  7.                 Label7.Visible = true;
  8.                 Response.Redirect("Webform2.aspx?Intitule=" + dplintitule + "&Id=" + dplid.ToString());
  9.             }
  10.             else
  11.             {
  12.                ...
  13.             }
  14.         }


 
Ce qui m'ennuie, c'est que la page web est redirigée sans que les 3 secondes aient eu lieu, ni que le message soit apparu !
 
En fait, je ne saisis pas trop ce que ton code soit censé faire  :??:  
 

Code :
  1. <meta http-equiv="refresh" content="3; URL='http://manouvelleadresse'" />


 
D'autant qu'avec ce code-là, chaque chargement de cette page sera précédé de 3 secondes d'attente...
 
Est-ce que j'ai rien compris ou bien nous sommes sur deux compréhensions différentes de la chose ?...

Message cité 1 fois
Message édité par mikekine le 08-07-2017 à 12:03:22

---------------
Topic Blindtest
Reply

Marsh Posté le 08-07-2017 à 20:03:09    

mikekine a écrit :


...
Est-ce que j'ai rien compris ou bien nous sommes sur deux compréhensions différentes de la chose ?...


 
Je pense en effet que tu n'as rien compris  :D  
Pour faire simple il te suffit de remplacer ton Response.Redirect par Response.AppendHeader.
Ce qui aura pour conséquence de rajouter la balise <meta http-equiv="refresh" content="3; URL='http://manouvelleadresse'" /> dans le header de ta page web.
 
Ton message sera alors affiché à l'utilisateur, puis le navigateur va changer de page après un délai de 3s.
 
 

Code :
  1. protected void Button2_Click(object sender, EventArgs e)
  2.         {
  3.             Double i = 0;
  4.             bool canConvert = Double.TryParse(TextBox3.Text, out i);
  5.             if (TextBox1.Text == "" || TextBox2.Text == "" || canConvert == false || i > 28 || i < 1)
  6.             {
  7.                 Label7.Visible = true;
  8.                 Response.AppendHeader("Refresh", "3; url=Webform2.aspx?Intitule="  + dplintitule + "&Id=" + dplid.ToString());
  9.             }
  10.             else
  11.             {
  12.                ...
  13.             }
  14.         }


Message édité par leujuiphe le 08-07-2017 à 20:10:20

---------------
"Je ne suis pas con, je fais de la rétention d'intelligence, Nuance" Philippe Geluck. ---- Ils sont chauves mes smileys
Reply

Marsh Posté le 08-07-2017 à 20:31:23    

Génial !! [:joey ramone]
 
Un tout grand merci à toi parce que ça me rendait zinzin  :pt1cable:


---------------
Topic Blindtest
Reply

Marsh Posté le 09-07-2017 à 18:30:58    

Je suis à nouveau bloqué dans une impasse :/
 
 
Toujours en rapport avec l'encryption des données :
 
Quand je charge la page, l'adresse URL est bien encryptée. Dans cette page, il y a une Dropdownlist. Dès que je choisis un autre item dans cette liste déroulante, l'encryption ne se fait plus... et l'adresse URL apparaît en clair.
En fait, j'ai l'impression que cette encryption ne se fait que lors d'un chargement complet de la page web, pas avec un postback...  
 
Si vous pouviez dire que je me trompe, ça serait cool !  :D


Message édité par mikekine le 09-07-2017 à 19:43:50

---------------
Topic Blindtest
Reply

Marsh Posté le 09-07-2017 à 23:30:20    

J'ai trouvé cette page : https://timsinajaya.wordpress.com/2 [...] k-request/
 
Ils indiquent une marche à suivre pour que le reload (par postback) soit lui aussi soumis à l'encryption... Seulement, leur description de la procédure est assez laconique et je sais pas très bien quoi faire...  
Si vous y voyez plus clair que moi...  :)


Message édité par mikekine le 10-07-2017 à 00:11:20

---------------
Topic Blindtest
Reply

Marsh Posté le 10-07-2017 à 09:19:43    

J'ai une question. Qui pourrait ne pas trop te plaire, j'avertis :o !

 

Pourquoi s'emmerder à vouloir mettre en place une encryption des urls alors que
- ça ne se fait jamais nulle part
- c'est super compliqué (httpmodule, problèmes divers qui font que ça ne fonctionne que dans une partie des cas et que tu dois traiter chaque url que tu génères et chaque url que tu traites en entrée)
- ça ne sert absolument à rien
- ça ne protège que dalle

 

Il y a une semaine tu ne savais pas faire une redirection et tu posais une question super basique sur la mécanique client/serveur, et là au contraire tu t'attaques à un sujet super ardu et plein de contraintes, tout en ne servant à rien. J'ai du mal à suivre.

 

Le seul cas où ça peut avoir un intérêt, c'est d'encrypter sélectivement tout ou partie d'une url, pour éviter l'énumération directe par un utilisateur. (genre un lien du type download.aspx?idElement=1, où en remplaçant "1" par "2" et ainsi de suite tu peux récupérer tous les éléments).

 

L'autre truc à faire, c'est d'éviter les urls sensibles en GET, le POST c'est mieux (genre surtout pas de transmission d'infos sensibles en get).

 

Le tout hébergé en https : CA c'est utile, simple, standard, et gratuit ou pas cher selon la solution adoptée.


Message édité par TotalRecall le 10-07-2017 à 09:24:15

---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 10-07-2017 à 12:35:36    

:hello:  
 
Oui, je me doute bien que je suis à côté des bonnes pratiques de programmation, avec cette appli... Je me suis lancé dans quelque chose que je ne maitrisais pas du tout !  
Mais bon, là, je suis lancé et j'ai pas trop envie de tout recommencer... De plus, je suis parvenu à résoudre mon problème (ci-dessus).
 
Je pense que j'irai bien acheter un bouquin qui traite de cela, histoire de (re)partir sur de bonnes bases. Peut-on faire confiance à ce qui est proposé sur Developpez.net ?
 
 

Citation :

Le seul cas où ça peut avoir un intérêt, c'est d'encrypter sélectivement tout ou partie d'une url, pour éviter l'énumération directe par un utilisateur. (genre un lien du type download.aspx?idElement=1, où en remplaçant "1" par "2" et ainsi de suite tu peux récupérer tous les éléments).


 
En fait, tu décris tout à fait ce pourquoi je suis passé par l'encryption !  :)


---------------
Topic Blindtest
Reply

Marsh Posté le 10-07-2017 à 12:36:50    

Dans ce cas tu fais ça juste pour ton cas précis, pas toutes tes urls.

 

PS : et je suis 100% ok avec leujuiphe sur le conseil de faire du .Net MVC plutôt que webforms :jap:. Je suis resté fidèle à webforms pas mal de temps pour certains types de projets où MVC était en retrait mais aujourd'hui je ne fais plus que ça pour du web.


Message édité par TotalRecall le 10-07-2017 à 12:38:43

---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 10-07-2017 à 16:58:41    

Voilà, j'arrive doucement au bout de mon projet. Je voulais vous remercier tous les 2 car vous m'avez bien aidé !  ;)  
 
Je vous explique quand même en quoi ça consiste, c'est la moindre des choses :o
 
Dans notre famille, nous échangeons des listes de cadeaux à Noël. Chacun met sur sa liste une série d'articles qui lui plaisent, et puis nous procédons à un tirage au sort secret. Chacun a donc en sa possession la liste de qqn d'autre sans que ce dernier le sache.  
Ca fait un bail que nous procédons de la sorte et je me suis dis l'année dernière qu'il faudrait un peu changer les règles. Dorénavant, chacun ne tirerait plus la liste complète d'une autre personne mais se verrait confier une liste avec des articles provenant de diverses personnes.
Donc, j'ai mis au point une appli qui se charge de faire tout cela, avec toutes les conditions que ça impose (je me suis pas mal arraché les cheveux sur cet algorithme  :pt1cable: ); en sortie l'appli crée des fichiers *.doc (liste générée aléatoirement) pour chaque personne.
Mais il restait le problème que c'est moi qui devait encoder toutes les données dans la DB (d'autant que j'aurais vu qui tirait qui)... Voilà donc comment j'en suis arrivé à créer ce site où chacun à la possibilité d'encoder ses articles, les modifier, les supprimer,...
 
Me reste la partie "Mettre tout ça en ligne"... Je sais pas encore trop comment procéder, mais je trouverai bien !  :)


---------------
Topic Blindtest
Reply

Marsh Posté le 10-07-2017 à 17:02:50    

Du .Net en hébergement gratuit c'est pas simple à trouver, en particulier selon la bdd derrière.


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 10-07-2017 à 17:34:40    

TotalRecall a écrit :

Du .Net en hébergement gratuit c'est pas simple à trouver, en particulier selon la bdd derrière.


J'ai bien un abo perso chez OVH mais ils ne supportent pas ASP... En plus, j'utilise SQL Server et non MySQL... [:spamatounet]


---------------
Topic Blindtest
Reply

Marsh Posté le 10-07-2017 à 17:36:26    

C'est bien ce que je dis : tu vas galérer un peu :o


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 10-07-2017 à 21:11:56    

J'ai vu qu'il y des tarifs raisonnable chez 1&1, par exemple https://www.1and1.fr/hebergement-windows
 
Et tu peux peut être regarder du côté d'Azure.
Il y a un calculateur de tarifs ici pour te faire une idée: https://azure.microsoft.com/fr-fr/pricing/calculator/
 
 
Après je n'ai testé ni l'un ni l'autre, donc à prendre avec de très grosses pincettes.
Tu devrais avoir très peu de traffic donc une configuration premier prix devrait être largement suffisante.
 
 
Concernant la base de données:
Tu peux éventuellement migrer vers une base mysql.
Ou bien, encore mieux, te passer de base de données relationnel et stocker tout ce que tu as besoin dans un ou plusieurs fichiers (txt, xml, csv au choix)
C'est parfois plus interessant, sisi.  :o  
 
Dans les 2 cas tu auras un peu de taf.  


---------------
"Je ne suis pas con, je fais de la rétention d'intelligence, Nuance" Philippe Geluck. ---- Ils sont chauves mes smileys
Reply

Marsh Posté le 11-07-2017 à 16:32:34    

J'ai un problème à la noix, et je ne me rappelle plus comment on résout ça...   [:tinostar]
 
Comment fait-on pour insérer dans la DB un ensemble de données lorsque l'une de celles-ci est inexistante ?
 
En gros, j'ai cette SP SQL :
 

Code :
  1. ALTER procedure [dbo].[EncodeArticle]
  2. @Intitule nvarchar(50),
  3. @Description nvarchar(max),
  4. @Prix float,
  5. @Id_Personne int,
  6. @Photo varbinary(max)
  7. as
  8. insert into Articles(Intitule,Description,Prix,Id_Liste,Photo) values (@Intitule,@Description,@prix,
  9. (
  10. Select Id_Liste
  11. from Listes
  12. where Id_Personne = @Id_Personne
  13. )
  14. ,@Photo)
  15. )


 
Or, la valeur @Photo peut ne pas exister et dans ce cas, la valeur dans la DB devrait être "null".
 
Est-ce qu'il faut tester la valeur dans le code C# avant de lancer l'INSERT ou bien faut-il faire une vérif dans la SP ?
 
Merci de me rafraîchir la mémoire !  :jap:


---------------
Topic Blindtest
Reply

Marsh Posté le 11-07-2017 à 17:01:25    

Ben l'un ou l'autre peu importe, mais là j'ai pas bien compris ta question, vu que @photo est un paramètre que tu passes explicitement à ta procstock.
Ta sous requête imbriquée dans le INSERT pour aller chercher Id_Liste me parait plutôt très moche et suspecte, tu devrais passer par une variable.


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 11-07-2017 à 17:54:23    

Bon... J'ai beau tout essayer, j'obtiens cette erreur :  
 

Citation :

{"La procédure ou fonction 'EncodeArticle' attend le paramètre '@Photo', qui n'a pas été fourni."}


 
 :sweat:  
 
Dans mon code, j'ai ceci :
 

Code :
  1. ...
  2. byte[] photo = reader.ReadBytes((int)stream.Length);
  3. ArticleBO objArticle = new ArticleBO(TextBox1.Text, TextBox2.Text, Convert.ToDouble(TextBox3.Text),photo);
  4. ...


Certaines fois, j'appelle la construction de l'objet avec une photo à la clé, d'autres fois, pas ! Et c'est bien quand je ne fournis pas de photo que ça coince !
 
 
Plus tard, j'ai ceci :
 

Code :
  1. static public void EncodeArticle(ArticleBO objArticle, int Id_Personne)
  2.         {
  3.             SqlConnection objConnection = new SqlConnection("Data Source = " + System.Environment.MachineName + "\\SQLEXPRESS; Database = Listenoel; UID = Michael; PWD = ****" );
  4.             SqlCommand objCommand = new SqlCommand();
  5.             SqlParameter objParam;
  6.             int nbreModif;
  7.             objCommand.Connection = objConnection;
  8.             objCommand.CommandType = CommandType.StoredProcedure;
  9.             objCommand.CommandText = "EncodeArticle";
  10.             objParam = new SqlParameter("@Intitule", objArticle.Intitule);
  11.             objCommand.Parameters.Add(objParam);
  12.             objParam = new SqlParameter("@Description", objArticle.Description);
  13.             objCommand.Parameters.Add(objParam);
  14.             objParam = new SqlParameter("@Prix", objArticle.Prix);
  15.             objCommand.Parameters.Add(objParam);
  16.             objParam = new SqlParameter("@Id_Personne", Id_Personne);
  17.             objCommand.Parameters.Add(objParam);           
  18.             objParam = new SqlParameter("@Photo", objArticle.Photo);
  19.             objCommand.Parameters.Add(objParam);
  20.             try
  21.             {
  22.                 objConnection.Open();
  23.                 nbreModif = objCommand.ExecuteNonQuery();
  24.                 objConnection.Close();
  25.             }
  26. ...


 
Je demandais donc tout à l'heure où c'était le mieux pour tester si la variable 'photo' était "null"...
En fait, ce que je trouve bizarre, c'est que justement, ça coince !


---------------
Topic Blindtest
Reply

Marsh Posté le 11-07-2017 à 18:44:57    

Ca fait des années que je n'ai pas trifouillé dans une BdD de cette façon, mais pour tout ce qui est null il ne faut pas utiliser la valeur "null" mais un substitut : "DBNull.Value"
Essaye de faire un truc du genre  
objParam = new SqlParameter("@Photo", (objArticle.Photo == null ? DBNull.Value : objArticle.Photo));
Sans AUCUNE garantie :o


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 11-07-2017 à 19:26:21    

TotalRecall a écrit :

Ca fait des années que je n'ai pas trifouillé dans une BdD de cette façon, mais pour tout ce qui est null il ne faut pas utiliser la valeur "null" mais un substitut : "DBNull.Value"
Essaye de faire un truc du genre  
objParam = new SqlParameter("@Photo", (objArticle.Photo == null ? DBNull.Value : objArticle.Photo));
Sans AUCUNE garantie :o


 
Ca ne donne rien  [:spamafote]


---------------
Topic Blindtest
Reply

Marsh Posté le 11-07-2017 à 22:40:55    

Bingo, je viens de trouver !  :D  
 
C'était tellement stupide que j'ai honte [:cupra]
 
Il fallait simplement rajouter "= null" après le paramètre :
 

Code :
  1. @Photo varbinary(max) = NULL


 
Voilà :p


---------------
Topic Blindtest
Reply

Marsh Posté le 12-07-2017 à 15:28:48    

Mon truc aurait du marcher, là tu gères le souci côté procstock mais ton code n'est toujours pas bon et le fait de ne pas spécifier le type de tes paramètres c'est pas top.
 
Et sinon je tiens quand même à te faire remarquer que t'as encore régressé depuis que tu faisais du winform, là tu fais du .Net 1.1 :o :whistle:


---------------
Topic .Net - C# @ Prog
Reply

Marsh Posté le 12-07-2017 à 18:52:23    

Tu me "détruis" un peu plus à chaque réponse [:joce]
 
J'ai encore une question, néanmoins... :)
 
 
Il est possible pour un user de visualiser sa liste de cadeaux; pour cela, j'utilise une Listview. Une des colonnes de cette Listview affiche une image (enregistrée au préalable).
 
Voici une partie du code :
 

Code :
  1. <ItemTemplate>
  2.                     <tr style="background-color:#DCDCDC; color: #000000;">
  3.                         <td>
  4.                             <asp:Label ID="IntituleLabel" runat="server" Text='<%# Eval("Intitule" ) %>' />
  5.                         </td>
  6.                         <td>
  7.                             <asp:Label ID="DescriptionLabel" runat="server" Text='<%# Eval("Description" ) %>' />
  8.                         </td>
  9.                         <td>
  10.                             <asp:Label ID="PrixLabel" runat="server" Text='<%# Eval("Prix" ) %>' />
  11.                         </td>
  12.                         <td>
  13.                             <asp:Label ID="ImagesLabel" runat="server" Text='<%# Eval("Images" ) %>' Height="150" Width="150" />
  14.                         </td>
  15.                     </tr>
  16.                 </ItemTemplate>


 
Le problème, c'est que ça m'affiche le type du champ et pas du tout l'image...  
 
Qu'est-ce qui m'a échappé ?  :??:


---------------
Topic Blindtest
Reply

Marsh Posté le 12-07-2017 à 20:14:36    

:hello:  
 
Tu n'utilises pas le bon control. "Label" sert à afficher du texte.
De mémoire ce que tu veux c'est le control asp:Image
 
Par contre je ne comprends pas trop pourquoi tu utilises une listview pour afficher un tableau.
Tu devrais plutôt utiliser une gridview. Surtout que ça te donne accès par défaut à un tri, de la pagination et du binding auto


---------------
"Je ne suis pas con, je fais de la rétention d'intelligence, Nuance" Philippe Geluck. ---- Ils sont chauves mes smileys
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed