Sei que a sessão e o REST não andam exatamente de mãos dadas, mas não é possível acessar o estado da sessão usando a nova API da Web? HttpContext.Current.Session
é sempre nulo.
asp.net
asp.net-web-api
Marca
fonte
fonte
[SessionState(SessionStateBehavior.Required)]
noApiController
faz o truque (ou.ReadOnly
onde apropriado).Respostas:
Para um projeto MVC, faça as seguintes alterações (WebForms e Dot Net Core respondem abaixo):
WebApiConfig.cs
Global.asax.cs
Esta solução tem o bônus adicional de que podemos buscar o URL base em javascript para fazer as chamadas AJAX:
_Layout.cshtml
e, em nossos arquivos / códigos Javascript, podemos fazer nossas chamadas de webapi que podem acessar a sessão:
Faça o acima, mas altere a função WebApiConfig.Register para obter um RouteCollection:
E, em seguida, chame o seguinte em Application_Start:
Adicione o pacote Microsoft.AspNetCore.Session NuGet e faça as seguintes alterações de código:
Startup.cs
Chame os AddDistributedMemoryCache e AddSession métodos nos serviços objeto dentro da função ConfigureServices:
e na função Configurar, adicione uma chamada ao UseSession :
SessionController.cs
No seu controlador, adicione uma instrução using na parte superior:
e use o objeto HttpContext.Session dentro do seu código da seguinte maneira:
agora você deve conseguir:
e, em seguida, acessar este URL o retirará:
Muito mais informações sobre o acesso aos dados da sessão no dot net core aqui: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state
Leia a resposta de Simon Weaver abaixo sobre desempenho. Se você estiver acessando dados da sessão dentro de um projeto WebApi, isso poderá ter conseqüências muito sérias no desempenho - eu já vi o ASP.NET impor um atraso de 200ms para solicitações simultâneas. Isso pode aumentar e se tornar desastroso se você tiver muitas solicitações simultâneas.
Verifique se você está bloqueando recursos por usuário - um usuário autenticado não poderá recuperar dados de seus WebApi aos quais não tem acesso.
Leia o artigo da Microsoft sobre autenticação e autorização na API da Web do ASP.NET - https://www.asp.net/web-api/overview/security/authentication-and-authorization-in-aspnet-web-api
Leia o artigo da Microsoft sobre como evitar ataques de hackers de solicitação de falsificação entre sites. (Em resumo, confira o método AntiForgery.Validate) - https://www.asp.net/web-api/overview/security/preventing-cross-site-request-forgery-csrf-attacks
fonte
Você pode acessar o estado da sessão usando um RouteHandler personalizado.
Encontrado aqui: http://techhasnoboundary.blogspot.com/2012/03/mvc-4-web-api-access-session.html
fonte
Por que evitar o uso da sessão na WebAPI?
Desempenho, desempenho, desempenho!
Há uma razão muito boa e muitas vezes esquecida pela qual você não deve usar a Sessão na WebAPI.
A maneira como o ASP.NET funciona quando a Sessão está em uso é serializar todas as solicitações recebidas de um único cliente . Agora não estou falando sobre serialização de objetos - mas executando-os na ordem recebida e aguardando a conclusão de cada um antes de executar o próximo. Isso evita condições desagradáveis de thread / corrida se duas solicitações tentarem acessar a sessão simultaneamente.
Então, o que isso significa para a API da Web? Se você tiver um aplicativo executando muitas solicitações AJAX, apenas um poderá executar por vez. Se você tiver uma solicitação mais lenta, ela bloqueará todas as outras desse cliente até sua conclusão. Em algumas aplicações, isso pode levar a um desempenho notavelmente lento.
Portanto, você provavelmente deve usar um controlador MVC se precisar absolutamente de algo da sessão de usuários e evitar a penalidade desnecessária de desempenho ao habilitá-lo para o WebApi.
Você pode facilmente testar isso sozinho
Thread.Sleep(5000)
inserindo um método WebAPI e habilitando a Session. Execute 5 solicitações e elas levarão um total de 25 segundos para serem concluídas. Sem a sessão, eles levarão um total de pouco mais de 5 segundos.(Esse mesmo raciocínio se aplica ao SignalR).
fonte
Bem, você está certo, o REST é sem estado. Se você usar uma sessão, o processamento se tornará estável, as solicitações subsequentes poderão usar o estado (de uma sessão).
Para que uma sessão seja reidratada, você precisará fornecer uma chave para associar o estado. Em um aplicativo asp.net normal, essa chave é fornecida usando um parâmetro cookie (sessões de cookie) ou url (sessões sem cookies).
Se você precisar de uma sessão, esqueça o resto, as sessões são irrelevantes nos designs baseados em REST. Se você precisar de uma sessão para validação, use um token ou autorize por endereços IP.
fonte
Marque, se você verificar o exemplo do nerddinner MVC, a lógica é praticamente a mesma.
Você só precisa recuperar o cookie e configurá-lo na sessão atual.
Global.asax.cs
Você terá que definir sua classe "SampleIdentity", que pode ser emprestada do projeto nerddinner .
fonte
Para corrigir o problema:
no Global.asax.cs
fonte
O último não está funcionando agora, pegue este, funcionou para mim.
no WebApiConfig.cs em App_Start
Global.asax
quarto aqui: http://forums.asp.net/t/1773026.aspx/1
fonte
Seguindo a resposta de LachlanB, se o seu ApiController não estiver em um diretório específico (como / api), você poderá testar a solicitação usando RouteTable.Routes.GetRouteData, por exemplo:
fonte
Eu tive esse mesmo problema no asp.net mvc, eu o corrigi colocando esse método no meu controlador api básico que todos os meus controladores api herdam:
Em sua chamada de API, você deseja acessar a sessão que acabou de fazer:
Eu também tenho isso no meu arquivo Global.asax.cs, como outras pessoas postaram, não tenho certeza se você ainda precisa dele usando o método acima, mas aqui está o caso:
Você também pode criar um atributo de filtro personalizado que possa ser usado nas chamadas da API que você precisa, e poderá usar a sessão na sua chamada da API como faria normalmente via HttpContext.Current.Session ["SomeValue"]:
Espero que isto ajude.
fonte
Eu segui a abordagem @LachlanB e, de fato, a sessão estava disponível quando o cookie da sessão estava presente na solicitação. A parte que falta é como o cookie de sessão é enviado ao cliente pela primeira vez?
Criei um HttpModule que não apenas habilita a disponibilidade do HttpSessionState, mas também envia o cookie ao cliente quando uma nova sessão é criada.
fonte
uma coisa precisa ser mencionada na resposta de @LachlanB.
Se você omitir a linha
if (IsWebApiRequest())
O site inteiro terá um problema de lentidão no carregamento da página se o site for misturado com páginas de formulário da web.
fonte
Sim, a sessão não anda de mãos dadas com a API Rest e também devemos evitar essas práticas. Mas, de acordo com os requisitos, precisamos manter a sessão de alguma forma, de modo que, em cada solicitação, o servidor cliente possa trocar ou manter estado ou dados. Portanto, a melhor maneira de conseguir isso sem quebrar os protocolos REST é se comunicar através de token como JWT.
https://jwt.io/
fonte
Voltando ao básico, por que não mantê-lo simples e armazenar o valor da Sessão em um valor html oculto para passar para sua API?
Controlador
cshtml
Javascript
$ (document) .ready (function () {
}
fonte