Min webservice hämtar en del information vid första anropet för en ny session som jag inte vill hämta varje gång i samma session. Sessionshanteringen är beroende av Cookies eller URL Redirect (Http Status 302) och utan lite extra kod så stödjer inte den proxyn som genereras när man skapar en "Web Reference" något av det här. Tackar för informationen. Skall testa så snart jag får tillfälle. Jag la till kod enligt ovan men får inte till det riktigt. PeO, Jo det var det som Patrik föreslog ovan och jag lade till detta. (Jag jobbar i VB men tror att jag fick till det rätt i alla fall). Men jag upptäcker ingen skillnad. Jag testar mot localhost, blir det annorlunda mot en remote server ? Gah!! Snacka om hjärnsläpp .. glöm min post helt eftersom det var patriks svar.. vilken blunder =P PeO, vilken av förslagen implementerade du?? Den ena är ju så att man får en ny cookie container per proxy objekt och den andra får man inte det. Jag provade båda men upptäckte ingen skillnad. PeO, OOPS. Nu var det jag som fick hjärnsläpp. Jag fick ett återfall till C++ tänkande precis som du påpekar. En instans av WbeServicen kommer att skapas vid varje anrop därför att det är så asp.net/http funkar. PeO, Varit på minisemester. Därav dröjsmål med svar.Sessionhantering vid webservice
Försöker hantera detta och det fungerar när man testar med testinterfacet som VS skapar. Men när jag kör från en testapplikation som har satt en webreferens till tjänsten, blir det en ny session varje gång.
Någon som har ett tips ?Sv: Sessionhantering vid webservice
För att sessionshantering med kakor skall fungera så måste man skapa en <b>CookieContainer</b> (System.Net.CookieContainer) och koppla den till proxyn.
För att komma åt koden som genererades för web-referensen, gör följande:
1) Välj "Show all files" i Server Explorer.
2) Expandera "Web References"
3) Expandera din web-reference
4) Expandera Reference.map
5) Välj Reference.cs och tryck F7 ( eller höger-klicka och välj show code)
Det finns ett par olika strategier för att hantera sessionskakor. Antingen så låter man varje instans av proxyn representera en session eller så låter vi alla instanser av proxyn använda samma session (Det finns även en tredje, att låta alla Web References dela på sessionen).
För att skapa cookiestödet så skall vi ändra lite i konstruktorn och nedan visar jag exempel på båda varianterna (count är namnet på min WS proxyklass)
För att låta alla instanser dela på samma session:
private static System.Net.CookieContainer cookieContainer
public Count() {
if(null==cookieContainer)
cookieContainer = new System.Net.CookieContainer();
this.CookieContainer = cookieContainer;
this.Url = "http://localhost/DryRun/SessionWS/Count.asmx";
}
För att låta varje instans av proxyn ha sin egen session:
public Count() {
this.CookieContainer = new System.Net.CookieContainer();
this.Url = "http://localhost/DryRun/SessionWS/Count.asmx";
}
Sv: Sessionhantering vid webservice
Sv: Sessionhantering vid webservice
Jag upptäckte senare att det skapas en ny instans av min WS för varje anrop från samma klient. Och de befintliga instanserna ligger kvar (försvinner antagligen när GC kommer in). Därför är det också en ny session, vilket jag inte önskar.
Detta händer alltså när jag kör med en testklient med en Webreferens, inte när jag testar med HTTP-GET.
Meningen är väl att en ny instans skall skapas när det dyker upp en ny klient och inte vid varje anrop från samma klient ? Och att instanserna dör bort efter en tid av overksamhet från klienten.
Tackar för tips.Sv: Sessionhantering vid webservice
Om jag inte minns fel så om du inte använder en webbläsare för att kommunicera med din webbservice så finns det inget stöd för cookies och det är vad som behövs för att kunna bibehålla en session mellan anrop. För att lägga till stöd för cookies så måste du använda dig av ett <b>CookieContainer</b> objekt.
Din CookieContainer skapar du och tilldelar <b>.CookieContainer</b> propertyt på din WebService proxy.
//AndreasSv: Sessionhantering vid webservice
Sv: Sessionhantering vid webservice
//AndreasSv: Sessionhantering vid webservice
Sv: Sessionhantering vid webservice
Fast jag börjar tro att problemet är något annat.
Jag lade till en shared counter som inkremeteras i New och dekremeteras i Finalize.
Sedan skriver jag dess värde i loggen i webmetoden och den ökar med ett för varje anrop, dvs det skapas en ny instans varje gång. Eller tänker jag fel här ? Och de tidigare lever kvar utan att någon använder dem.
Och nu när jag provar verkar det bli en ny instans även om jag ropar med HTTP-GET.
Eller har jag fått det här med Session och Application om bakfoten ?
Jag provade även att lägga cookiecontainern i min form för testprogrammet:
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
SR = New StreamReader("r.txt")
cContainer = New System.net.CookieContainer
......
och anropet:
CC = New localhost.CCCalculate
CC.CookieContainer = cContainer
Try
CCRes = CC.CC_Comp_1("346010", "MKS", sRefr, "273,15", sFields(iIndexTable(4))......)
Catch es As Exception
MsgBox(es.Message)
End TrySv: Sessionhantering vid webservice
Att lita på att din Finalize metod kommer att exekveras är fel. En destruktor i .NET fungerar annorlunda mot dem man är van vid från C++. Det finns INGA garantier på om, när eller i vilken ordning som Finalize metoden kommer att anropas. Finalize bör enbart användas som sista utvägen för upp resning, man använder Dispose för kontrollerad nedbrytning av ett objekt.
Om vi nu fantiserar om att Finalize alltid kommer att anropas på ett objekt så kvarstår frågan "när kommer den att anropas"... den kommer helt enkelt att anropas nästa gång som garbage collectorn körs. Det styrs av Optimization Engine i .NET (algoritmen är inte helt dokumenterad), när du anropar <b>new</b> och det inte finns mer minne för det nya objektet eller om du själv tvingar igång den genom att anropa GC.Collect().
Att tvinga igång GC själv är 99 av 100 gånger inte bra design då du garanterat inte kan fatta ett bättre beslut än Optimization Engine om när minneshantering skall köras. Anledningen till att det inte är en bra anledning är att resten av tådarna för din applikation slutar att exekveras under tiden.
Hur står det till med minner? - Del1
http://www.pellesoft.se/documents/pageblank.aspx?id=12004
//AndreasSv: Sessionhantering vid webservice
Nåja frågan kvarstår, varför skapas en ny instans för varje anrop ?
Jag ser också att mängden allokerat minne ökar stadigt, så det skapas nog verkligen en ny instans varje gång.
Något tips om detta ?Sv: Sessionhantering vid webservice
HTTP är ett stateless protokoll, vilket innebär att det är fire and forget.
Enda sättet att komma ihåg klienten är att spara information om anropet i en sessions-kaka. När du sen kommer in med nästa anrop, så vet igentligen asp.net inte om vem du är, men genom att läsa kakan så laddar den upp information från det centrala minnet om dig (din session). Det innebär att det inte spelar någon roll hur många instanser av din webservice du skapar, minnet för din session lagras centralt i din asp.net applikation och är åtkomstbart överallt ifrån, alltså inte bara din instans av webservicen.
Det är väldigt konstigt att det inte funkar på det sättet du gjort det, CookieContainers skall vara det enda du behöver tänka på. Kan du lägga upp koden ngnstans?Sv: Sessionhantering vid webservice
Löst det sig? Eller finns problemet kvar? Om du löste ditt problem så markera inlägget som <b>löst</b> annars skriv ett inlägg och beskriv var du befinner dig idag med problemet så skall vi se om vi inte kan fortsätta därifrån och hitta en lösning.
//AndreasSv: Sessionhantering vid webservice
Jag tror det hela har löst sig nu. problemet var en kombination av bristande erfarenhet av hur ASP.Net fungerar samt slarvfel i implementeringen. Många tester fram och tillbaka så blir dt lite rörigt efter ett tag. Tack för hjälpen, det har varit lärorikt.