web-dev-qa-db-fra.com

HttpContext dans la bibliothèque standard .net

Je travaille sur quelques projets dont l’un est une application ASP.NET 4.5 et l’autre est le projet .Net Core API 1.1. L'application asp.net utilise les classes HttpContext pour lire les cookies et les en-têtes de page. Maintenant, je dois déplacer ceci vers une bibliothèque standard .net qui peut être utilisée à la fois par le projet. Je ne trouve pas HttpContext dans le SDK standard .net. Aucune suggestion?

11
Vishal A

Votre approche pose un problème: .NET Standard est l’implémentation la plus simple du système .NET disponible, ce qui signifie que seules les fonctionnalités de base indépendantes de la plate-forme et des scénarios sont implémentées.
HttpContext existe à la fois dans .NET Framework et .NET Core (les deux implémentant .NET Standard, soit dit en passant), mais étant spécifique au Web, il n'existe pas dans .NET Standard.

Donc, vous avez trois options:

  1. Ciblez le .NET Framework et utilisez System.Web.HttpContext
  2. Ciblez .NET Core et utilisez Microsoft.AspNetCore.Http.HttpContext
  3. Éloignez la logique qui utilise HttpContext du projet .NET Standard

Notez cependant que ces classes varient énormément. La version .NET Core a été créée pour ASP.NET Core, une version très différente de ASP.NET 4.5 et des versions antérieures.

13
Camilo Terevinto

À partir de .NETStandard 2.0, vous pouvez utiliser HttpContext.

Votre fichier .csproj ressemblera à ceci:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>
</Project>

Remarque: il s’agit d’un fichier de projet vide. Il est donc possible que d’autres dépendances soient répertoriées (par exemple, <ItemGroup>...</ItemGroup>).

Pour installer le paquet nuget requis, exécutez simplement la commande dotnet cli ou utilisez le programme NuGet Package Manager .

dotnet add package Microsoft.AspNetCore.Http.Abstractions
4
pimbrouwers

Je dois déplacer ceci [lire les cookies et les en-têtes de page] vers une bibliothèque standard .NET qui peut être utilisée par le projet ...

Ne faites pas cela.

Supposons que vous exécutiez une opération X sur les données lues à partir des cookies. Vous pouvez déplacer cette opération X vers la bibliothèque. Le travail des projets ASP.NET consiste à gérer le pipeline de demandes. La lecture des cookies appartient à cet endroit.

1
gldraphael

Je ne suis pas d'accord avec ces réponses et le non-sens de n'avoir que HttpContext dans le projet Web. C’est en fait étroitement couplé, car VOUS souhaitez pouvoir réutiliser du code et, par conséquent, une bibliothèque de classes au format .net standard OR .net DEVRAIT être en mesure d’utiliser le paramètre HttpContext.

Donc, dans un .NET Standard, vous voulez ajouter:

Microsoft.AspNetCore.Http.Abstractions

Malheureusement, le nouveau HttpContext est tellement différent HttpContext.Current est manquant et la session et la demande, etc.

(Oui, je comprends les motifs et pourquoi je les sépare et le rend plus testable)

Voici un petit truc que vous pouvez également obtenir pour obtenir Current

namespace System.Web
{
    public static class HttpContext
        {
            private static Microsoft.AspNetCore.Http.IHttpContextAccessor m_httpContextAccessor;


    public static void Configure(Microsoft.AspNetCore.Http.IHttpContextAccessor httpContextAccessor)
        {
            m_httpContextAccessor = httpContextAccessor;
        }


        public static Microsoft.AspNetCore.Http.HttpContext Current
        {
            get
            {
                return m_httpContextAccessor.HttpContext;
            }
        }

    }
}
0
Tom Stickel

Je suis d’accord avec la réponse ci-dessus, vous voulez garder les bibliothèques netstandard simples et libres de requêtes Web si possible. Il existe un package de nuget System.Net.Http qui cible la norme .net. Cela pourrait être utilisé lors de la mise à jour de la version 4.6.x pour une structure complète et pour le noyau .net si vous créez une bibliothèque et que vous ne voulez pas la surcharge de asp.net. 

0
Kentonbmax