2017-07-24 1 views
0

Je dois appeler un service web reposant avec un seul paramètre de l'événement d'insertion dans une table de base de données SQL Server. Je sais que ce n'est pas la conception idéale, mais je n'ai aucun contrôle sur l'un ou l'autre point final. L'utilisation de cette fonctionnalité ne dépassera pas 100 événements/min à charge maximale.Comment appeler un service reposant de la détente SQL Server

Je suis ouvert à d'autres idées mais les deux options que j'ai trouvées étaient;

  1. déclencheur d'insertion - Service Broker - Windows .NET service pour appeler le service Web
  2. C# déclencheur CLR pour appeler le service reposant directement

Je travaille sur l'option 2 et a créé un déclencheur CLR SQL projet dans Visual Studio mais après avoir ajouté les références à System.Web le projet ne construira pas et il n'y a pas d'erreurs de construction, vs dit simplement "build failed" dans la fenêtre de sortie.

Existe-t-il des restrictions concernant les bibliothèques CLR pouvant être utilisées dans un déclencheur CLR? L'utilisation du courtier de services me fait peur puisque je n'ai travaillé que sur un projet avec le courtier de service et que j'ai trouvé cela très difficile à mettre en œuvre.

Toute idée sur la façon d'appeler le service Web à partir de l'événement déclencheur serait grandement appréciée.

David

+2

Pourquoi diable ne besoin d'une référence vous 'System.Web' dans un déclencheur CLR SQL ??? Les déclencheurs sont des travailleurs d'arrière-plan - et 'System.Web' contient des contrôles d'interface graphique basés sur des formulaires Web, principalement - très peu clair pourquoi vous avez besoin de cette référence.Et oui: le SQL CLR a un ensemble très limité d'assemblys qui sont déjà déployés dans SQL Server –

+3

En outre: un déclencheur est exécuté dans le contexte et la portée de l'instruction qui le déclenche. Un déclencheur devrait être ** très agile ** - petit et rapide. Vous ne devriez jamais appeler des services externes à partir d'un déclencheur, vous ne devriez pas inclure de curseurs dans les déclencheurs - toutes ces choses vont tuer les performances de votre système et sont vraiment vraiment horriblement mauvaises à faire. Essayez de repenser votre situation et assurez-vous que le déclencheur ne fait que de très petites petites tâches - pas de lourdes charges, pas de calculs longs, pas d'appels externes, etc ... –

+0

Je copiais les références d'un projet existant qui appelle le service reposant. Je n'étais pas sûr de ceux dont j'avais besoin et suis allé avec eux tous, le code pour appeler le service Web utilise '(HttpWebRequest) WebRequest.Create (paramètres EndPoint +);'. Je pourrais être en mesure d'utiliser simplement System.Net – David

Répondre

3

Un déclencheur est exécuté dans le contexte et la portée de la déclaration qui l'amène à feu - ce qui signifie, cette déclaration ne va pas terminée tant que le déclencheur est exécuté complètement.

Un déclencheur devrait être très agile - petit et rapide. Vous ne devez jamais appeler des services externes à partir d'un déclencheur, vous ne devez pas inclure de curseurs dans les déclencheurs, vous ne devez pas effectuer de lourds levages ou de longs calculs dans un déclencheur.

Si vous devez vraiment faire quelque chose comme ça, je vous recommande une approche qui:

  • voir la gâchette vient de mettre quelques valeurs dans une table « Commande » - ces valeurs que la longue durée processus devra achever son travail

  • avoir un processus séparé découplé (par exemple une procédure stockée ou quelque chose) qui vérifie périodiquement cette table "commande" pour les nouvelles tâches à effectuer - cela peut être fait dans SQL Server à l'aide d'un Agent SQL Server

  • le processus découplé saisit alors les informations de la table « Commande », est-ce est le travail et met à jour la base de données (si nécessaire)

De cette façon, votre déclencheur est petit et agile et complète rapidement, donc pas ralentir votre processus principal/système principal. Le processus long est découplé, autonome et peut être implémenté de la façon qui a le plus de sens (procédure stockée dans SQL Server ou un outil de ligne de commande autonome distinct, par exemple).