2010-04-23 13 views
5

Mam aplikację asp.net i webservices (asmx), które znajdują się w tej samej aplikacji, ale nie w tym samym folderze plików aspx. Mam również aplikację WinForm, która korzysta z usług sieciowych. Oznaczyłem metody usług internetowych za pomocą [WebMethod (EnableSession = true)], ale nie mogę udostępniać tych samych wartości sesji, które są w aplikacji w serwisach internetowych. Aplikacja winform ma dostęp do sessionid z aplikacji i używam następujący kodUdostępnianie sesji między usługą web i aplikacją asp.net

Uri uri = new Uri(ServerServiceUrl); 
_cookieContainer = new CookieContainer(); 
_cookieContainer.Add(new Cookie("ASP.NET_SessionId", SessionID, "/", uri.Host)); 

Moje pytanie brzmi: czy istnieje coś, co mi brakuje albo robi źle, że nie może uzyskać dostępu do sessioin aplikację z serwisów internetowych?

+3

Dlaczego potrzebujesz sesji w usłudze internetowej? Czy przechowujesz jakiś tymczasowy stan? W takim przypadku, usługi IMO powinny być bezpaństwowe i przez to twój problem nie istniałby ... – Sunny

+0

Zgadzam się, musisz pomyśleć o usługach internetowych, takich jak klasy statyczne – Pierreten

+0

Moje usługi aspx, podobnie jak aplikacja, rozmawiają z usługami webowymi java i gdy aplikacja wywołuje usługi, przechowuje wartości przez pewien okres czasu. Zamiast wielokrotnie wywoływać usługi java, chcę użyć danych, które zostały buforowane przez aplikację. Dlatego właśnie chcę podzielić się sesją. –

Odpowiedz

1

Nie mogę rzucić światła na to, dlaczego nie można zmusić aplikacji WinForm do "przejęcia" sesji - to, co robisz, wygląda tak, jak powinno robić dokładnie to, czego chcesz.

Chciałem tylko zasugerować, aby użyć pamięci podręcznej aplikacji (do buforowania odpowiedzi z usługi java) zamiast magazynu sesji użytkownika. To ma następujące zalety: -

  • a) Jeżeli w pamięci podręcznej informacje dotyczą więcej niż jednego użytkownika (na przykład dostęp kontrolowany), następnie ta sama informacja w pamięci podręcznej mogą być wykorzystywane do wielu użytkowników, a nie naciągane dla każdej sesji .
  • b) Masz większą kontrolę nad tym, ile rzeczy jest buforowanych dla/kiedy są one wyłapywane, niż dane sesji (które przetrwają dożywotnią sesję i mają ryzyko rosnącego i rosnącego, jeśli zapomnisz usunąć stare informacje)
  • c) Jeśli nie uda ci się przejąć kontroli nad sesją, nadal możesz uzyskać dostęp do danych w pamięci podręcznej z dowolnej sesji.
0

Czy próbowałeś dziedziczyć swoją klasę usługi sieciowej od System.Web.SessionState.IRequiresSessionState?

Jest zwykle używany do obsługi protokołu http, ale usługi sieciowe korzystają z tego samego interfejsu znacznika.

+0

Nie próbowałem tego, ale jak rozumiem, przez dodanie [WebMethod (EnableSession = true)] na każdej metodzie sprawia, że ​​sesja jest włączona. Mam dostępne zmienne sesji, jest to po prostu nowa sesja, a sesja nie została już utworzona w aplikacji. –

+0

Właśnie zrealizowany. Czy uzyskujesz dostęp do usługi internetowej z tego samego komputera? w takim przypadku czy na pewno powinieneś używać "uri.Host", a nie interfejsu pętli zwrotnej podczas konfigurowania pliku cookie? – Radu094

Powiązane problemy