web-dev-qa-db-fra.com

Comment utiliser SqlServer.Types/types spatiaux dans une application ASP.NET Core 1.0

Une de nos bibliothèques de classes utilise les types spatiaux Microsoft tels que DbGeography. Lorsque nous exécutons notre application sur une machine propre sans les anciennes versions de SQL Server et Visual Studio, nous obtenons cette exception:

Les types et fonctions spatiaux ne sont pas disponibles pour ce fournisseur parce que la version 10 .__ de l'assembly 'Microsoft.SqlServer.Types' ou plus élevé n'a pas pu être trouvé.

La solution consiste apparemment à installer ce paquet Nuget:

Install-Package Microsoft.SqlServer.Types

Après l’installation, le package Nuget explique comment référencer les DLL de chaque type de projet:

Pour déployer une application qui utilise des types de données spatiales sur une machine sur laquelle les «Types de CLR système pour SQL Server» ne sont pas installés, vous devez également déployer le Assembly SqlServerSpatial110.dll natif. 

Les versions x86 (32 bits) et x64 (64 bits) de cet assemblage ont été ajoutées à votre projet dans les sous-répertoires SqlServerTypes\x86 et SqlServerTypes\x64. L'assembly natif msvcr100.dll est également inclus dans le cas où le moteur d'exécution C++ n'est pas installé.

Vous devez ajouter du code pour charger le bon assemblage lors de l'exécution (en fonction de l'architecture actuelle). 

Applications ASP.NET Pour les applications ASP.NET, ajoutez la ligne de code suivante à la méthode Application_Start dans Global.asax.cs: SqlServerTypes.Utilities.LoadNativeAssemblies (Server.MapPath ("~/bin"));

Applications de bureau Pour les applications de bureau, ajoutez la ligne de code suivante à exécuter avant toute opération spatiale: SqlServerTypes.Utilities.LoadNativeAssemblies (AppDomain.CurrentDomain.BaseDirectory);

Le site du projet de paquetage nuget ne répond pas, je ne suis donc pas sûr que ce soit la meilleure approche à utiliser maintenant en 2016.

Mon problème est, je ne comprends pas comment appeler LoadNativeAssemblies à partir d'une application ASP.NET Core 1.0. Nous utilisons le cadre complet (net461) et non le cadre principal.

public class Startup
{
    public Startup(IHostingEnvironment env)
    {
        ...
        SqlServerTypes.Utilities.LoadNativeAssemblies(env.WebRootPath);
        ...
    }
}

Quel est le meilleur moyen d'inclure les fichiers dll SqlServer.Types dans une application ASP.NET 1.0?

Questions connexes ici et ici sur StackOverflow.

Merci beaucoup.

16
Ender2050

Je travaille aujourd'hui sur une application ASP.NET Core (.NET Framework dessous, pas .NET Core, comme l'affiche d'origine).

Ce que j'ai remarqué, c'est que l'ajout du package Nuget directement à mon site ASP.NET Core n'a généré aucun fichier supplémentaire. Vous ne savez pas si les packages ont déjà été mis à jour pour fonctionner avec ASP.NET Core?

Quoi qu'il en soit, je viens d'ajouter le package à un projet .NET Framework 4.x traditionnel et d'extraire le dossier SqlServerTypes qu'il crée, puis de placer ce dossier à la racine de mon projet ASP.NET Core. A changé la propriété Copy to Output Dicrectory pour les 4 DLL inférieures situées sous Do not copy en Copy Always et a ajouté l'appel à la LoadLibrary().

Il convient de noter que la version 14.x du package est en réalité SQL vNext qui n’est pas sorti, il aurait dû être marqué comme une pré-version dans mon esprit. Je suis resté avec 13.x puisque nous utilisons SQL 2016.

A l'origine, j'avais placé cela dans le fichier Program.cs, car cela n'avait rien à voir avec la configuration de Middleware, ServiceInjection ou de l'hébergement. Mais ensuite, il faut que le sentier passe par la réflexion, qui est laide. Donc, je le mets plutôt comme première ligne du constructeur de démarrage, car à partir de là, je peux utiliser le chemin HostingEnvironment.

public Startup(IHostingEnvironment env)
{
    SqlServerTypes.Utilities.LoadNativeAssemblies(env.ContentRootPath);

    //The normal config as usual down here...
    var configuration = new ConfigurationBuilder()
        .SetBasePath(env.ContentRootPath)
        .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
        .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
        .AddEnvironmentVariables();
}
3
Nick Albrecht

je résous cela avec un bindingRedirect dans le fichier web.config.

  <dependentAssembly>
    <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-14.0.0.0" newVersion="14.0.0.0" />
  </dependentAssembly>

im utilisant SQL 2016, ASP.NET (pas de cœur) et EF 6.0.0.0

2
emo

Je l'ai corrigé, ce n'est pas une solution miracle, en fait c'est tout sauf un problème:

Je devais créer un dossier dans/bin nommé packages avec le package de types de serveur SQL ... Et je devais le faire dans chaque projet référencé par celui d'asp net core qui utilisait des types de serveur SQL de sorte qu'il semble s'agir d'un bogue ou une erreur dans les fichiers cibles.

Notez que cette solution de contournement devra être effectuée par tous les membres de votre équipe car le contenu de/bin ne sera pas sous le contrôle de source, comme prévu.

J'espère que ça aide (en attendant, c'est corrigé)

(Eh bien, il est trop tard, demain, je réfléchirai un peu plus à la cause du problème et à la façon dont je l'ai résolu. Si je trouve un meilleur moyen de contourner le problème, je vous le ferai savoir en sachant qu'il fonctionne correctement.

0
Juan

Utilisation de .net core 2.0. Après avoir installé le paquet nuget mentionné ci-dessus, je l'ai placé dans Program.cs avant la ligne avec BuildWebHost (args) .Run (); et cela a fonctionné ..

Utilities.LoadNativeAssemblies (AppDomain.CurrentDomain.BaseDirectory); SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version = 14.0.0.0, Culture = neutre, PublicKeyToken = 89845dcd8080cc91";

0
graemep

cela semblait fonctionner pour moi:

    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            ...
            SqlServerTypes.Utilities.LoadNativeAssemblies(env.WebRootPath + @"path to the project that contains the SQLServerTypes folder");
            ...
        }
    }

Je remarque que IHostingEnvironment.WebRootPath renvoie le chemin qui pointe vers la racine www. Cependant, dans la configuration de ma solution, j'ai plusieurs projets dans ce dossier. Il vous suffit donc de lui indiquer le projet vers lequel vous souhaitez vous diriger. Désolé si cela n'aide pas.

0
ArchNineTails