webForumDet fria alternativet

Cacha globalt på servern

.NET

21 svar · 575 visningar · startad av lucgo446

Medlem sedan aug. 2002221 inlägg
Frågan#1

Hej

Kan man Cacha globalt på servern? Alltså inte ApplicationsCachen.

Alla Applikationer ska dela på en global cache. typ som Global Assembly Cache fast det fungerar som ApplicationsCachen.

Eller måste vi då ha en State Server eller Cache server?

problematik... samma object är Cachat på olika applikationer... inte bra, sparar över... sql dependencies funkar inte här för att alla olika object kommer från samma tabel.

asp.net 2.0.5, sqlserver 2005

Medlem sedan maj 20012 812 inlägg
#2

Kan man Cacha globalt på servern? Alltså inte ApplicationsCachen.

Titta på COM+ där kan du skapa ett "Singelton objekt" som instansieras första gången du kallar på det, sedan så har du kvar objektet i minnet hela tiden och vilken applikation som helst kan anropa detta objekt. Du får alltså en global cach som alla dina program (som du skriver) kan använda sig av.

- M

Medlem sedan aug. 2002221 inlägg
#3

bygga en egen Cache med COM+, är det det enda alternativet?

Medlem sedan dec. 19996 721 inlägg
#4

lucgo446 skrev:

bygga en egen Cache med COM+, är det det enda alternativet?

Nej, men beskriv gärna lite mer vad du vill uppnå och vad det är du vill cacha.

Medlem sedan aug. 2002221 inlägg
#5

Jag ska cacha egendefinerade objekt så som user-objekt, artikel-objekt m.fl. oftast när man hämtar ett object och jobbar med ett så anropas det många gånger, därmed vill jag ha det i en cache.

Sedan kan samma objekt anropas på en annan applikation, och då kan den inte ligga i två olika cachar, då kan man enkelt skriva över...

kort och gott kan man säga att det är en admin till x antal clienter. klient-applikationerna både presenterar och modifierar innehåll i objekten,

Några goa synpunkter?

Medlem sedan aug. 2002221 inlägg
#6

NET Remoting måste väl kunna lösa mina problem? måste läsa på ....

Medlem sedan maj 20012 812 inlägg
#7

NET Remoting måste väl kunna lösa mina problem? måste läsa på ....

Remtoing är en sämre lösning än vad ett COM+ object är, dels så är det långsammare dels så missar du funktionallitet som finns inbyggt i COM+ (typ transactionsstöd)

COM+ är inte speciellt svårt, det enda som krävs är att ditt object ärver from ServiceComponent samt några attribute på klassen/methoderna så har du ditt object som kan köras i COM+

- M

Medlem sedan aug. 2002221 inlägg
#8

Okej, nu har jag gjort som jag tror ska funka, och det gör det när sparar i Gac:en (men bara innom applikationen) men inte när jag kör regsvcs och den ligger i Componentservices... då hittar den inte ens assemblyn när jag använder "using EdgeII.GlobalCache;"

vart ska den ligga i gacen eller i Componentservices?

Alltså jag vill få min cache att funka globalt på servern mellan applikationer och inte för varje Application separat.

jag har följt anvisningar på följande länk:
http://www.codeproject.com/csharp/SimpleComPlusCache.asp

using System;
using System.Collections;
using System.EnterpriseServices;

[assembly: ApplicationName("EdgeII.GlobalCache")]
[assembly: ApplicationActivation(ActivationOption.Library)]
[assembly: AssemblyTitle("EdgeII.GlobalCache")]
[assembly: AssemblyVersion("1.0.0.5")]
[assembly: AssemblyKeyName("MyKey")]

namespace EdgeII.GlobalCache
{
    [ObjectPooling(Enabled=true, MinPoolSize=1, MaxPoolSize=1)]
    [ComponentAccessControl(false)]
	public class Cache: ServicedComponent
	{
		private static Hashtable cachedHash;

        public Cache() { }
        static Cache() { }

        public static object Get(string key)
		{
			if(key == null)
			{
				throw new ArgumentNullException("key");
			}

            if (cachedHash == null)
                return null;

     			return cachedHash[key];
		}

        public static void ClearCache()
		{
			cachedHash = null;
		}

        public static void Add(string key, object newObj)
		{
            if (cachedHash == null)
                cachedHash = new Hashtable();

            if (cachedHash.ContainsKey(key))
            {
                cachedHash.Remove(key);
            }
	cachedHash.Add(key, newObj);

		}
		
protected override bool CanBePooled()
        {
            return true;
        }
	}	
}
Medlem sedan maj 20012 812 inlägg
#9

Du skall inte använda dig av library eftersom library gör att du får en kopia per applikation, du skall använda dig av server istället.

- M

Medlem sedan aug. 2002221 inlägg
#10

Det gör ingen skillnad...

ska den ligga i Gacen eller ComponentServices? eller både och?
när den enbart ligger i ComponentServices kommer jag inte åt den, varför?

ska jag använda mig av
<add assembly="EdgeII.GlobalCache, Version=1.0.0.5, Culture=neutral, PublicKeyToken=276E9C075A488F29"/>
i Web.Config?

Medlem sedan maj 20012 812 inlägg
#11

Här kommer kod från ett Settings objekt som jag har använt och som fungerar bra.

	[Guid("71478FB5-2669-4cc0-8705-3CBCCE2A049B")]
	public interface ISetting
	{
		//-- Public methoder som skall exponeras via Interfacet.
	}

	/// <summary>
	/// Cache for setting key value pairs
	/// </summary>
	[Guid("2F9472CF-A7CC-4bb6-AAB8-437CB9C2406D")]
	[Description("Cache for setting key value pairs")]
	[JustInTimeActivation(true)]
	[ObjectPooling(true,5,10)]
	[EventTrackingEnabled()]
	[Synchronization(SynchronizationOption.Required)]
	[Transaction(TransactionOption.Disabled)]
	public class SettingManager: ServicedComponent, ISetting
	{
		#region Declaration
		private bool myCanBePooled = true;
		#endregion
	
		#region Construtor
		public SettingManager()

		}
		#endregion

		#region override ServicedComponent Methods
		[AutoComplete(true)]
		protected override bool CanBePooled()
		{
			return myCanBePooled;
		}
		[AutoComplete(true)]
		protected override void Activate(){}
		[AutoComplete(true)]
		protected override void Deactivate(){}

	}

Här är koden från assemblyfilen

[assembly: AllowPartiallyTrustedCallers]
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile(@"..\..\..\EnterpriseGateway.key")]
[assembly: AssemblyKeyName("")]

[assembly: ApplicationName("EnterpriseGateway - Setting")]
[assembly: ApplicationID("619A78A7-99E1-41f3-8229-D8AB8F5CBB5B")]
[assembly: ApplicationActivation(ActivationOption.Server)]
[assembly: ApplicationAccessControlAttribute(false)]

Sedan så skall filen bara registreras i GAC:en och sedan installeras i COM+. Det fungerar hur bra som helst för mig.

Jag lägger inte till något som helst i web.config, bara att referera dll/projektet när jag vill använda mig av det.

- M

Medlem sedan aug. 2002221 inlägg
#12

Nu har jag implementarat som ovan.

Jag använder inte visual studio .net, det är nog därför som jag inte förstår vad som händer när man använder "add reference", vs gör en massa i bakgrunden. Och använder jag Visuel Web Devoloper 2005 när jag klickar "add reference" kan jag välja .net/COM/Browse. Har jag installerat den i gacen finns den under .net fliken.. så skapas en referens-tagg i Web.config. Här funkar cachen på applications- och inte på server-nivå.

browsar jag fram dll:en, läggs den i bin catalogen.. det kan ju inte vara meningen heller.

Under COM får jag inte upp den alls. men väljer jag nån dll här så läggs en kopia i /bin, varför? då blir den väl inte global på servern?

Je ne comprend pas!!!

PS. jag har både installerat den med gacutil och regsvcs

Medlem sedan maj 20012 812 inlägg
#13

browsar jag fram dll:en, läggs den i bin catalogen.. det kan ju inte vara meningen heller.

Bör inte spela någon som helst roll då .NET själv kommer att välja att köra med din COM+ version.

Har du tittat i component manager/component services under administration tools och sett så att din component verkligen är installerad i COM+?

- M

Medlem sedan aug. 2002221 inlägg
#14

Bör inte spela någon som helst roll då .NET själv kommer att välja att köra med din COM+ version.

okej, så det är så det funkar... va bra... visste inte

ja, den är installerad under Component services...

ska trixa lite till

Medlem sedan maj 20012 812 inlägg
#15

Du kan enkelt kolla om du kör din komponent från COM+ eller ej.

Du går in under COM+ och kolla alla körande processer (gäller endast de som körs som services). Se till så just din komponent inte körs. Starta sedan din applikation och kör den, om allt fungerar så skall din komponent nu finnas under körande komponenter.

- M

Medlem sedan aug. 2002221 inlägg
#16

Tack för alla svar Gladh, nu har jag bifogat min.dll i bin men den verkar inte trigga den i COM+. Se bild 1.

Behöver det inte vara nån metatag i aspx sidorna som talar om att det är COM+ jag ska använda och inte den i bin? för nu triggas den i bin ju (Det är samma dll, version, applikations nr m.m).

OBS! jag kan starta com+ manuellt, så den fungerar uppenbarligen. Den har egenskapen activation server.

Hur ska activation context vara? se bild 2.

Eller är det Identity egenskapen, vad ska den vara tro? se bild 3 (OBS det står längs ner i prop-fönstret, Server app kan inte köras under system service accounts)

Nu är det nära...

com.GIFcom_prefs.GIFidentity.GIF
Medlem sedan maj 20012 812 inlägg
#17

Jag kan inte förstå varför du har sådan problem, det fungerar utan problem för mig.

Jag sätter bara en referens till den DLL som jag registrerade i COM+ och så fungerar det, kanske skall säga att det INTE kopieras ner en dll till BIN katalogen för webprojektet, utan där ligger endast webapplikations filerna.

Jag ser också att min komponent startar genom att den körs i running process.

Här kommer 4 bilder.

1. Där ser du min komponent samt att den inte kör.
2. Där ser du sökvägen till min komponents dll.
3. Debugläge i .NET som visar att koden körs
4. Visar att min komponent nu är aktiv.

MVH
Magnus

bild1.PNGbild2.PNGbild3.PNGbild4.PNG
Medlem sedan maj 20012 812 inlägg
#18

så här ser min projekt fil ut som refererar till DLL:en vet inte om den hjälper dig eller ej.

            <References>
                <Reference
                    Name = "System"
                    AssemblyName = "System"
                    HintPath = "..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.dll"
                />
                <Reference
                    Name = "System.Drawing"
                    AssemblyName = "System.Drawing"
                    HintPath = "..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Drawing.dll"
                />
                <Reference
                    Name = "System.Data"
                    AssemblyName = "System.Data"
                    HintPath = "..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
                />
                <Reference
                    Name = "System.Web"
                    AssemblyName = "System.Web"
                    HintPath = "..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.Web.dll"
                />
                <Reference
                    Name = "System.XML"
                    AssemblyName = "System.XML"
                    HintPath = "..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
                />
                <Reference
                    Name = "BRF.EnterpriseGateway.Setting"
                    AssemblyName = "BRF.EnterpriseGateway.Setting"
                    HintPath = "..\..\..\Source\DotNet 2003\Udvikling og Test\EnterpriseGateway\Bin\BRF.EnterpriseGateway.Setting.dll"
                />
                <Reference
                    Name = "System.EnterpriseServices"
                    AssemblyName = "System.EnterpriseServices"
                    HintPath = "..\..\..\WINDOWS\Microsoft.NET\Framework\v1.1.4322\System.EnterpriseServices.dll"
                />
            </References>
Medlem sedan aug. 2002221 inlägg
#19

Jepp,

vs.net gör en så kallad Runtime Callable Wrapper (RCW) när du lägger in en Reference till COM objektet.
källa:
http://www.dnjonline.com/article.aspx?ID=sep01_COMtodotNET

Men eftersom min dll inte är en type library så kan jag inte göra en Wrapper av den. Type Lib är bara gamla COM och inte .net assemblies som det här är...

måste läsa vidare...

PS Gladh, Har du den i Gacen oxå eller?

Det här borde funka endå, för länge sen... hmm

Medlem sedan aug. 2002221 inlägg
#20

Gladh:

Bör inte spela någon som helst roll då .NET själv kommer att välja att köra med din COM+ version.

Jag försöker hitta om det är sant, var har du läst det?

273 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
126 ms — deklarationer (db)
0 ms — hämta statistik (cache)
141 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)