Pregunta

Sin entrar en si esta es una buena o mala idea:

¿Es posible almacenar un objeto de dominio LINQ-to-SQL en la sesión ASP.NET, cuando la sesión está fuera de proceso ?

[EDITAR] Actualmente recibo el siguiente error y formulé esta pregunta porque sospecho que los objetos LINQ-to-SQL:

No se puede serializar el estado de la sesión. En el modo 'StateServer' y 'SQLServer', ASP.NET serializará los objetos de estado de la sesión y, como resultado, no se permiten objetos no serializables u objetos MarshalByRef. Se aplica la misma restricción si el almacén de estado de sesión personalizada realiza una serialización similar en modo 'Personalizado'. [/ EDITAR]

por ejemplo

Session["Zoo"] = new Zoo() { 
                         new Lion(),
                         new Tiger(), 
                         new Elephant()
                  }

donde:

  • Zoo, Lion, Tiger, Elephant salen de un ZooDataContext

y el archivo web.config contiene

<sessionState
       mode="StateServer"
       stateConnectionString="tcpip=127.0.0.1:42424"
       stateNetworkTimeout="10"
       sqlConnectionString="SqlStateConnectionString"
       sqlCommandTimeout="30"
       timeout="20"
       regenerateExpiredSessionId="true"/>
¿Fue útil?

Solución

Serialícelos usando el serializador de contratos de datos antes de almacenarlos en la sesión o cualquier otra cosa que desee serializar ... Recientemente discutido aquí :

http: / /social.msdn.microsoft.com/Forums/en-US/linqtosql/thread/81c84ff4-059b-474f-9c69-b8c59027fd48

Otros consejos

Para usar el formateador binario (como el uso de SessionState, creo), necesitaría generar su código usted mismo desde el DBML (lo hago actualmente con una plantilla Linq2Sql T4).

Lo siguiente debe marcarse como [No serializado] :

  • EntityRef
  • EntitySet
  • Todos los eventos (necesitará pensar fuera de la caja para hacer esto, hacer ejercicio para el lector)

También la lógica del constructor debe moverse a OnCreated . También debe asegurarse de que se llame a OnCreated al deserializar para que el objeto pueda ser útil nuevamente. El proceso se realiza con el atributo [OnDeserializing] .

Creo que necesitaría marcar sus objetos como serializables. No estoy seguro de si hay una manera de hacer esto para todos los objetos generados, pero para aquellos que está poniendo en sesión, podría crear una clase parcial (por ejemplo, de Lion) y darle el atributo Serializable.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top