As instâncias de class estáticas são exclusivas de uma solicitação ou de um servidor no ASP.NET?

Em um site do ASP.NET, as classs estáticas são exclusivas de cada solicitação da Web ou são instanciadas sempre que necessário e enviadas sempre que o GC decide descartá-las?

A razão que eu pergunto é porque eu escrevi algumas classs estáticas antes em C # eo comportamento é diferente do que eu esperava. Eu teria esperado classs estáticas para ser exclusivo para cada solicitação, mas não parece que é o caso.

Se eles não são exclusivos para cada solicitação, existe uma maneira de permitir que eles sejam?

ATUALIZAR:
A resposta que driis me deu foi exatamente o que eu precisava. Eu já estava usando uma class singleton, no entanto, ele estava usando uma instância estática e, portanto, estava sendo compartilhado entre as solicitações, mesmo se os usuários fossem diferentes, o que neste caso era uma coisa ruim. Usando HttpContext.Current.Items resolve meu problema perfeitamente. Para qualquer um que se deparar com essa questão no futuro, aqui está minha implementação, simplificada e abreviada para que seja fácil entender o padrão:

 using System.Collections; using System.Web; public class GloballyAccessibleClass { private GloballyAccessibleClass() { } public static GloballyAccessibleClass Instance { get { IDictionary items = HttpContext.Current.Items; if(!items.Contains("TheInstance")) { items["TheInstance"] = new GloballyAccessibleClass(); } return items["TheInstance"] as GloballyAccessibleClass; } } } 

Suas classs estáticas e campos de instância estáticos são compartilhados entre todas as solicitações para o aplicativo e têm a mesma vida útil do domínio do aplicativo. Portanto, você deve ter cuidado ao usar instâncias estáticas, pois você pode ter problemas de synchronization e afins. Também tenha em mente que as instâncias estáticas não serão GC’ed antes do pool de aplicativos ser reciclado e, portanto, tudo que é referenciado pela instância estática não será GC’ed. Isso pode levar a problemas de uso de memory.

Se você precisar de uma instância com o mesmo tempo de vida de uma solicitação, sugiro usar a coleção HttpContext.Current.Items . Isso é planejado para ser um local para armazenar coisas que você precisa durante a solicitação. Para melhor design e legibilidade, você pode usar o padrão Singleton para ajudá-lo a gerenciar esses itens. Basta criar uma class Singleton que armazene sua instância em HttpContext.Current.Items . (Na minha biblioteca comum para ASP.NET, eu tenho uma class SingletonRequest genérica para essa finalidade).

Os membros estáticos têm um escopo do processo de trabalho atual apenas, portanto, ele não tem nada a ver com solicitações, porque solicitações diferentes podem ou não ser manipuladas pelo mesmo processo de trabalho.

  • Para compartilhar dados com um usuário específico e entre solicitações, use HttpContext.Current.Session.
  • Para compartilhar dados em uma solicitação específica, use HttpContext.Current.Items.
  • Para compartilhar dados em todo o aplicativo, escreva um mecanismo para isso ou configure o IIS para trabalhar com um único processo e escreva um Aplicativo singleton / use.

A propósito, o número padrão de processos de trabalho é 1, então é por isso que a web está cheia de pessoas pensando que os membros estáticos têm um escopo de todo o aplicativo.

Como os tipos estão contidos em um domínio de aplicativo, esperaria que as classs estáticas estivessem presentes, desde que o domínio do aplicativo não seja reciclado ou que a solicitação seja veiculada por um domínio de aplicativo diferente.

Eu posso pensar em várias maneiras de fazer objects específicos para uma solicitação específica depende do que você quer fazer, por exemplo, você poderia instanciar o object em Application.BeginRequest e armazená-lo no object HttpRequest para que ele possa ser acessado por todos os objects em o pipeline de processamento de pedidos.

Se eles não são exclusivos para cada solicitação, existe uma maneira de permitir que eles sejam?

Não. Os membros estáticos são de propriedade do processo do ASP.NET e compartilhados por todos os usuários do aplicativo da Web. Você precisará recorrer a outras técnicas de gerenciamento de session, como variables ​​de session.

Normalmente, methods, propriedades e classs estáticos são comuns no nível do Application . Enquanto o aplicativo estiver vivo, eles serão compartilhados.

Você pode especificar um comportamento diferente usando o atributo ThreadStatic . Nesse caso, eles serão específicos para o segmento atual, que, acredito, é específico para cada solicitação.
Eu não aconselho isso, embora pareça complicado demais.

Você pode usar HttpContext.Current.Items para definir coisas para uma solicitação, ou HttpContext.Current.Session para definir coisas para um usuário (entre solicitações).

Em geral, a menos que você tenha que usar coisas como Server.Transfer , a melhor maneira é basicamente criar coisas uma vez e então passá-las explicitamente via invocação de método.