• úvod
  • témata
  • události
  • tržiště
  • diskuze
  • nástěnka
  • přihlásit
    registrace
    ztracené heslo?
    TENCOKACISTROMYProgramovani v C#, F# a dalsich jazycich pro .NET, Mono a ostatni CLI implementace
    VIRTUALVOID
    VIRTUALVOID --- ---
    tak je to ono, account pod ktorym ti bezi iis resp. app pool sajty kde mas tu slzbu nema ten kom nainstalovany...
    NECROMAN
    NECROMAN --- ---
    VIRTUALVOID: jako chybu ot hlasi:
    Retrieving the COM class factory for component with CLSID {A8F57566-79B7-48F3-B439-979373CFFF94} failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).
    VIRTUALVOID
    VIRTUALVOID --- ---
    pozri app pool a jeho login ci ma na to dany user pod ktorym bezi pravo... mozno je to blbost ale skus
    NECROMAN
    NECROMAN --- ---
    vite nekdo, jak pustit v IIS WCF sluzbu, ktera pouziva non=managed com knihovny? Kdyz to testuju normalne v binu, tak to funguje, ale v IIS to aplikace nemuze najit... je treba pouzit nejake specialni postupy?
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    SMOKY: Hmm. To by asi slo. Kdyz by se zmenila tabulka, zapsala by se zmena do logovaci tabulky, na ty by byla povesena dependency, aplikace by si precetla zmeny, a zareagovala.
    SMOKY
    SMOKY --- ---
    TENCOKACISTROMY: Trigger + tabulka zmen ?
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    Tak SqlDependency uz jede. Mam ale problem, ze z ni nezjistim jaky radky se zmenily (insert/update/delete). Nemate napad, jak to zjistit?

    Napadlo me, ze bych si tam k zaznamum dal casovy razitka, jenze to mi nevyresi smazany zaznamy.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    TENCOKACISTROMY: Tak vyreseno dle Using SqlDependency for data change events. Nazev tabulky tam musi byt vcetne nazvu schematu (cili "dbo.tblLoginToken").
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    Pracoval jste nekdo se tridou SqlDependency? Nejak mi to nechce fungovat :/.

    Vytvorim si tu dependency (metoda Init() z kodu nize) a pusti se mi ta udalost jen jednou, i kdyz menim data v tabulce :/.

    Vystup:
    cnn.State: Open
    dependency_OnChange {
            Info = Invalid,
            Source = Statement,
            Type = Subscribe
    /****************************************/
            cnn.State = Open
    }
    
    Kod:
    	public class SqlBasedCache {
    		SqlConnection cnn;
    		SqlDependency dependency;
    		public void Init( SqlConnection connection ) {
    			if (connection.State != System.Data.ConnectionState.Open) {
    				connection.Open();
    			}
    
    			this.cnn = connection;
    
    			var cmd = connection.CreateCommand();
    			cmd.CommandText = "SELECT LoginToken, IDAccount, IDPlayer FROM tblLoginToken";
    
    			var permission = new SqlClientPermission( System.Security.Permissions.PermissionState.Unrestricted );
    			permission.Demand();
    
    			this.dependency = new SqlDependency( cmd, null, 0 );
    			var rsltStart = SqlDependency.Start( connection.ConnectionString );
    
    			this.dependency.OnChange += new OnChangeEventHandler( dependency_OnChange );
    
    			using (var reader = cmd.ExecuteReader()) {
    				while (reader.Read()) {
    					/* do nothing */
    				}
    			}
    		}
    
    		void dependency_OnChange( object sender, SqlNotificationEventArgs e ) {
    			var sbMsg = new StringBuilder();
    			sbMsg.AppendLine( "dependency_OnChange {" )
    				.Append( "\t" ).Append( "Info = " ).Append( e.Info ).AppendLine( "," )
    				.Append( "\t" ).Append( "Source = " ).Append( e.Source ).AppendLine( "," )
    				.Append( "\t" ).Append( "Type = " ).Append( e.Type ).AppendLine()
    				.AppendLine( "/****************************************/" )
    				.Append( "\t" ).Append( "cnn.State = " ).AppendLine( cnn.State.ToString() )
    				.AppendLine( "}" );
    
    			var strMsg = sbMsg.ToString();
    			Console.WriteLine( strMsg );
    		}
    	}
    
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    BUTHRAKAUR: Ten token sam o sobe zadny ID neobsahuje. ID uzivatele mam zapsany ve dvojici s tim loginTokenem ted na serveru v Cache. Ale trida Cache neni urcena pro takovyhle veci (a tak se lehce stane, ze ten loginToken z pameti zmizi).

    BUTHRAKAUR: Zajimavej napad, zamyslim se nad tim.
    BUTHRAKAUR
    BUTHRAKAUR --- ---
    TENCOKACISTROMY: slo mi o to, ze pak nemusis resit ten persistentni stav sluzby/session, ale jednoduse si pokazdy z tokenu desifrujes to userId..
    BUTHRAKAUR
    BUTHRAKAUR --- ---
    TENCOKACISTROMY: ja myslel sifrovat ciste jen ten token - to prece nebude nic vypocetne narocnyho, kdyz obsahuje jen to userId..

    NECROMAN: zalezi, jak presne pracujes s tema WCF client proxy - zpusobu je vic a ja to ted z hlavy neznam, protoze to nepouzivam primo. hledal bych ale spis problem v tom WCF volani nez MVC.. + to, co jsi psal s tim lockovanim jsem nejak nepochopil. jestli tam nejak sam resis vlakna, tak to muze bejt taky problem :)
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    BUTHRAKAUR: nejakymu komplikovanymu sifrovani bych se rad vyhnul, protoze mi to sezere nejakej ten CPU cas a ty data, ktery se preposilaj nejsou nijak extra zvlast citlivy.
    NECROMAN
    NECROMAN --- ---
    BUTHRAKAUR: ja to prave volam synchronne, zadne callbacky, ale proste mi to zahadne vytuhne vzdy, kdyz se mi zpracovavaji tri vlakna a v jednom volam tu metodu z WCF proxy objektu :-|
    BUTHRAKAUR
    BUTHRAKAUR --- ---
    TENCOKACISTROMY: aha, tak potom asi vazne budes muset pouzit tu DB nebo jiny persistentni uloziste + cache ;( leda si ten token nejakym svym obousmernym algoritmem generovat, sifrovanej davat klientovi a v service si ho zase zpatky rozebirat..
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    BUTHRAKAUR: Na komunikaci vyuzivam protokol AMF (klientem je Flash/Flex aplikace - online hra), v hlavicce si nic takovyho neposlu :|. Tech requestu je pomerne hodne (nekolik za minutu).

    Nekdy v budoucnu bych rad byl schopnej udelat web-garden (predpokladame X tisic aktivnich klientu najednou).

    A souhlasim s tim, ze bych ty sluzby chtel mit state-less.
    BUTHRAKAUR
    BUTHRAKAUR --- ---
    NECROMAN: a proc tu WCF nevolas synchronne? stejne musis na vysledek v tom action-vlakne cekat, ne? btw vytvaret WCF konekci pri kazdym zavolani akce muze byt pomerne zdlouhavy..

    jinak na WCF doporucuju Castle WCF Facility - super nastroj na utiseni WCF bolesti se spravou tech pripojeni apod :)
    BUTHRAKAUR
    BUTHRAKAUR --- ---
    TENCOKACISTROMY: pokud vim, tak best practice SOA/WCF je posilat auth udaje v headeru kazdy zpravy.. jestli to dobre chapu, tak ty v podstate uchovavas "session" state mezi requestama (tu vazbu loginToken-Account.Id), coz neni uplne cisty reseni. sluzby by mely byt state-less.
    TENCOKACISTROMY
    TENCOKACISTROMY --- ---
    Mam WCF sluzbu hostovanou v IIS. Po overeni uzivatele (hash(username+password) nebo facebookid) vygeneruju jedinecnou hodnotu pro jeho identifikaci (loginToken).

    K tomuhle loginTokenu si priradim ID uzivatele (hodnota z tabulky "Account" v databazi). Tenhle loginToken mi ten uzivatel posila, kdyz vola WCF operace.

    Kam bych si mel ten loginToken ukladat, kdyz chci aby vydrzel i recyklaci procesu?
    Jako nejlepsi reseni se mi jevi to ukladat do databaze + mit v ty WCF sluzbe singleton, kterej ma tyhle hodnoty nacachovany + ma SqlDependency na db tabulku s tema loginTokenama.

    Nemam tam nejakou chybu v tomhle konceptu? Existuje lepsi reseni? Je uz neco takovyho hotovyho?
    NECROMAN
    NECROMAN --- ---
    LZe zmenit nastaveni podle tohoto navodu dole, aniz by clovek musel prepisovat sytemovy soubor machine.config? Kdyz dam primo do appconfigu sve aplikace treba toto:

    <processModel maxWorkerThreads="96" minWorkerThreads="8" maxIoThreads="96" minIoThreads="8" />

    tak mi to hlasi, ze nelze menit to, co lze nastavit jen v machine.config
    http://blog.stevensanderson.com/2010/01/25/measuring-the-performance-of-asynchronous-controllers/
    Kliknutím sem můžete změnit nastavení reklam