---
title: "Cacha globalt på servern"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/133480-cacha-globalt-på-servern"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "lucgo446"
published: "2005-08-30T08:05:03.000Z"
updated: "2005-09-07T05:24:29.000Z"
replies: 21
views: 619
page: 1
pages: 2
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/133480-cacha-globalt-på-servern"
---

# Cacha globalt på servern

_Sida 1 av 2._

## #1 — lucgo446, 2005-08-30T08:05Z

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

Permalänk: https://www.webforum.nu/p/133480

## #2 — Gladh, 2005-08-30T08:38Z

> 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

Permalänk: https://www.webforum.nu/p/1663890

## #3 — lucgo446, 2005-08-30T17:35Z

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

Permalänk: https://www.webforum.nu/p/1664036

## #4 — emission, 2005-08-30T20:05Z

> **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.

Permalänk: https://www.webforum.nu/p/1664070

## #5 — lucgo446, 2005-08-31T06:08Z

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?

Permalänk: https://www.webforum.nu/p/1664152

## #6 — lucgo446, 2005-08-31T13:00Z

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

Permalänk: https://www.webforum.nu/p/1664266

## #7 — Gladh, 2005-08-31T14:31Z

> 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

Permalänk: https://www.webforum.nu/p/1664292

## #8 — lucgo446, 2005-09-01T12:39Z

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;
        }
	}	
}
```

Permalänk: https://www.webforum.nu/p/1664546

## #9 — Gladh, 2005-09-01T13:35Z

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

Permalänk: https://www.webforum.nu/p/1664566

## #10 — lucgo446, 2005-09-01T13:46Z

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?

Permalänk: https://www.webforum.nu/p/1664572

## #11 — Gladh, 2005-09-02T06:08Z

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

Permalänk: https://www.webforum.nu/p/1664782

## #12 — lucgo446, 2005-09-02T12:37Z

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

Permalänk: https://www.webforum.nu/p/1664926

## #13 — Gladh, 2005-09-05T06:37Z

> 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

Permalänk: https://www.webforum.nu/p/1665216

## #14 — lucgo446, 2005-09-05T10:52Z

> 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

Permalänk: https://www.webforum.nu/p/1665296

## #15 — Gladh, 2005-09-05T18:31Z

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

Permalänk: https://www.webforum.nu/p/1665514

## #16 — lucgo446, 2005-09-06T07:50Z

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...

Bilagor:

- [com.GIF](https://www.webforum.nu/a/7674.gif)
- [com_prefs.GIF](https://www.webforum.nu/a/7675.gif)
- [identity.GIF](https://www.webforum.nu/a/7677.gif)

Permalänk: https://www.webforum.nu/p/1665684

## #17 — Gladh, 2005-09-06T11:15Z

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

Bilagor:

- [bild1.PNG](https://www.webforum.nu/a/7678.png)
- [bild2.PNG](https://www.webforum.nu/a/7679.png)
- [bild3.PNG](https://www.webforum.nu/a/7680.png)
- [bild4.PNG](https://www.webforum.nu/a/7681.png)

Permalänk: https://www.webforum.nu/p/1665764

## #18 — Gladh, 2005-09-06T11:18Z

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>
```

Permalänk: https://www.webforum.nu/p/1665767

## #19 — lucgo446, 2005-09-06T13:37Z

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

Permalänk: https://www.webforum.nu/p/1665831

## #20 — lucgo446, 2005-09-06T14:25Z

**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?

Permalänk: https://www.webforum.nu/p/1665847

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/133480-cacha-globalt-på-servern  
Nästa sida: https://www.webforum.nu/amne/dotnet/133480-cacha-globalt-på-servern/page2.md
