Pergunta

Eu tenho um aplicativo web que atualmente usa o atual HttpContext para armazenar um contexto LINQ dados. O contexto é mantido para a solicitação atual, em uma base por usuário, por Rick Strahl do blogue :

string ocKey = "ocm_" + HttpContext.Current.GetHashCode().ToString("x")  
Thread.CurrentContext.ContextID.ToString();

if (!HttpContext.Current.Items.Contains(ocKey))
{
    // Get new Data Context and store it in the HTTP Context
}

No entanto, tenho alguns scripts que são executadas a partir do arquivo global.asax, que não têm um HttpContext. O HttpContext.Current é NULL , porque o servidor é quem faz a "pedido".

Existe um objeto equivalente que eu possa usar para armazenar o contexto de dados? Então eu não precisa se preocupar com re criando-lo, e anexar / desanexar objetos? Eu só quero a persistir o contexto para a vida de meus processos.

ATUALIZADO:

Atualmente, estou tentando usar uma variável estática na minha classe DAL ajudante. na primeira chamada a um dos métodos na classe DataContext é instanciado, e armazenado na variável estática. No final do meu processo, eu chamar outro método que chama Dispose no DataContext, e define a variável estática para NULL.

Foi útil?

Solução

Você pode não apenas usar uma variável estática especificamente para esses scripts? Que terá o mesmo tempo de vida como o AppDomain. Você provavelmente deve pensar cuidadosamente sobre quaisquer preocupações de concorrência, mas parece que a maneira mais simples de manter um valor ao redor.

(Eu verifiquei apenas, e apesar de uma instância de HttpApplication pode ser usado para atender a várias solicitações, cada um só serve um pedido de cada vez -. O que sugere que várias instâncias são criadas para o processamento de solicitações simultâneas que não têm Validado isso, mas ele faz soar como ele não seria seguro para mantê-lo em uma variável de instância.)

EDIT: A resposta de Josh sugere que você quer que isso seja por thread. Isso soa um pouco estranho para mim, como a menos que você tem um muito desses eventos ocorrem, você é bastante provável que só nunca vê-los executar em diferentes tópicos, fazendo todo o sentido de partilha de negócios. Se você realmente quer esse tipo de coisa, eu sugiro apenas usando uma variável de instância na classe derivada-HttpApplication - para exatamente a razão descrito no parágrafo acima:)

Outras dicas

Por que não usar a corrente HttpContext? Os scripts em seu arquivo global são o resultado de uma solicitação vinda ao servidor, por isso deve haver um contexto associado a esse pedido, que você pode pegar.

Eu não entendo a necessidade de gerar a chave baseado no hashcode ou o fio. Não vai ser uma instância separada do HttpContext para cada solicitação que vem, e essa instância vai ser específico para o segmento que está processando a solicitação. Por causa disso, a chave é praticamente inútil quando ela é baseada na instância de HttpContext e o fio.

Além disso, como é que se elimine o DataContext quando você é feito? Ele implementa IDisposable por uma razão, então eu recomendaria contra uma instância compartilhada como esta.


Atualizar

Nos comentários, isso indica que há um temporizador que está em execução que está a executar os scripts. Em vez do temporizador, eu recomendaria a criação de uma tarefa agendada que irá chamar um webservice ou página predeterminado no site que irá executar a tarefa. Em seguida, você sempre terá um HttpContext para trabalhar.

HttpContext.Current é um método estático e deve estar disponível em qualquer lugar, desde que o código está sendo executado dentro do contexto de uma solicitação.

No seu caso a sua não execução dentro do contexto de uma solicitação, você pode olhar para usando Application.Cache mas eu teria cuidado contra a realização de um DataContext aberto. Eu não sou muito famillar com LINQ to Entities, para que eu pudesse estar errado, mas os dados geralmente cache basear itens relacionados, tais como conexões é ruim.

Eu também recomendo que você considerar que se deslocam a lógica fora de seu global.asax e um serviço do Windows. Isso permitiria que você tem mais controle sobre essas tarefas, por exemplo, você pode desligá-los seperatley do web site.

Editar

pontos como JS fora você poderia usar uma variável estática. Você também pode definir uma variável de instância marcada com o atributo ThreadLocal. Isto vai dar cada thread a sua própria cópia da variável, e pode eliminar contenção. Desde que você quer cada thread para ter a sua própria cópia de qualquer maneira.

Existe uma razão pela qual estes necessidade de ser tratadas da mesma forma que as outras DataContexts? Parece-me que, se o contexto só é necessária dentro da rotina de tratamento de eventos, você não precisa mantê-lo ao redor. Especialmente se for em Application_Start (como por seu comentário), eu não me incomodaria cache-lo em qualquer lugar -. Apenas usá-lo localmente e passá-lo para os outros métodos, conforme necessário

Defina o DataContext como o parâmetro de estado ao criar o timer. Com base na informação que você postou nos comentários, parece-me que o seu DataContext está mais relacionado com os temporizadores que qualquer outra coisa.

Além disso, evite usar o mesmo DataContext para diferentes temporizadores, porque você iria acabar com modificações mistas de diferentes temporizadores. Também certifique-se a sua mesma lógica temporizador não é executado duas vezes, uma vez que faria com que o mesmo período ou seja curto demais sem controle.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top