ASP.net Web Api 2-Webservice durch SSIS-Paket aufrufen
avatar

Das Problem

Bei einem Kunden sollte ich einen bestehenden Webservice (der mit ASP.net Web Api 2 implementiert wurde) durch ein SSIS-Paket aufrufen. Die Daten sollten dann transformiert und in eine Datenbank geschrieben werden.
Meine Erinnerung sagte mir: „da gibt’s doch schon etwas fertiges in der Toolbox“. Nach kurzer Zeit setzte dann jedoch die Ernüchterung ein: der „Web Service Task“ in der Toolbox ist nur für SOAP-Services gedacht 🙁
Also weiter recherchiert…

Die Lösung

Ziemlich schnell stieß ich dann auf die Information, dass ich wohl selbst einen Skript-Task erstellen musste der per Webclient den Aufruf meines Webservices vornahm und die Daten aus Output-Spalten herausgab.
Nachfolgend stelle ich hier meinen Lösungsansatz mit einem vereinfachten ASP.net Web Api 2 Webservice und dem SSIS-Skript-Task vor.

Der Artikel gliedert sich in 3 Teile:
– ASP.net Web Api 2-Webservice erstellen
– Test-Client für ASP.net-Web Api 2-Webserice erstellen
– Umsetzung des erarbeiteten Test-Client-Codes als SSIS-Skript-Task

Hier folgt nun zunächst der Teil zur Erstellung des Webservice.

Da ich bisher noch keine WebApi2-Webservices erstellt hatte, bin ich dem Tutorial unter [1] gefolgt.
Im Visual Studio 2013 habe ich zunächst eine Web-Application als Web API erstellt. Hierzu wird erst das Template „ASP.NET Web Application“ aus der Kategorie „Web“ ausgewählt. Nach einem Klick auf „ok“ erscheint dann weiteres Fenster in welchem das Template „Empty“ ausgewählt werden muss und die Checkbox für Web API“ gesetzt werden muss:webapi-ws-1

Es wird dann ein leeres (aber bereits funktionsfähiges) Webservice-Projekt erstellt.
Im Solution-Explorer wird dann unter „Models“ ein neue Klasse namens „Product“ erstellt:webapi-ws-2

Die Klasse bekommt anschließend 4 Properties:

  1. namespace TestWebApi2.Models
  2. {
  3. public class Product
  4. {
  5. public string Id { get; set; }
  6. public string Name { get; set; }
  7. public string Category { get; set; }
  8. public decimal Price { get; set; }
  9. }
  10. }

Im nächsten Schritt wird unter „Controller“ ein neuer Controller erstellt:webapi-ws-3

Im „Add Scaffold„-Dialog wird dann „Empty Web API 2 Controller“ ausgewählt und dieser „ProductsController“ genannt:

webapi-ws-4

Der Code des Controllers muss angepasst werden, damit er eine Liste von Produkten (welche in diesem Fall als Objekt direkt im Konstruktor erzeugt werden) ausgibt.

Hier der vollständige Code:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web.Http;
  5. using TestWebApi2.Models;
  6. namespace TestWebApi2.Controllers
  7. {
  8.   // Tutorial is here: https://www.asp.net/web-api/overview/getting-started-with-  aspnet-web-api/tutorial-your-first-web-api
  9.   public class ProductsController : ApiController
  10.   {
  11.    List<Product> products;
  12.   public ProductsController()
  13.   {
  14.     this.products = new List<Product>();
  15.     this.products.Add(new Product { Id=„1“, Name=„Tomatensuppe“, Category=„Lebensmittel“, Price=1 });
  16.     this.products.Add(new Product { Id=„2“, Name=„Jo-jo“, Category=„Spielzeug“, Price=3.75M });
  17.     this.products.Add(new Product { Id=„3“, Name=„Hammer“, Category=„Werkzeug“, Price=16.99M });
  18.   }
  19.   public IEnumerable<Product> GetAllProducts()
  20.   {
  21.     return products;
  22.   }
  23.   [HttpPost]
  24.   public IHttpActionResult GetProducts([FromBody] List<int> id)
  25.   {
  26.     var foundProduct = (
  27.       from o in this.products
  28.       join p in id on o.Id equals p.ToString() into t
  29.       from od in t.DefaultIfEmpty()
  30.       where od > 0
  31.       select o
  32.    ).ToList<Product>();
  33.   if (products == null)
  34.   {
  35.     return NotFound();
  36.    }
  37.    return Ok(foundProduct);
  38.   }
  39.  }
  40. }

Zunächst wird in Zeile 12 eine Produktlisten-Variable erzeugt.
In den Zeilen 14 bis 20 wird im Konstruktor diese Liste mit Beispieldaten befüllt.
In Zeile 22 bis 25 sieht man eine Methode um per GET-Request alle Produkte als JSON-Format zurück zu bekommen.
Die Methode „GetProducts“ von Zeile 27 bis 46 dient dazu, nur eine bestimmte Menge von Produkten zurückzugeben.
Sie nimmt dazu eine Liste von ID’s entgegen, welche per POST-Request übergeben werden und filtert mithilfe eines LINQ-To-Objects-Statements die gesuchten Produkte heraus.
Falls keine Produkte gefunden wurden, wird eine Fehlermeldung zurückgegeben.

Weiterhin muss in der Datei „WebApiConfig.cs“ noch das Routing angepasst werden, damit sowohl Controller als auch Action angegeben werden können:

  1. config.Routes.MapHttpRoute(
  2.   name: „DefaultApi“,
  3.   routeTemplate: „api/{controller}/{action}/{id}“,
  4.   defaults: new { id = RouteParameter.Optional }
  5.  );

Damit die Rückgabe der Controller nun auch in JSON erfolgt, muss in der „WebApiConfig.cs“ noch der Formatter richtig konfiguriert werden.
Hierzu gibt es zwei Möglichkeiten:

  1. // change default output to json (method 1, new add a formatter)
  2. //config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue(„text/json“));
  3. // method2: delete xml-formatter
  4. var formaters = GlobalConfiguration.Configuration.Formatters;
  5. formaters.Remove(formaters.XmlFormatter);

Möglichkeit 1 besteht darin einen neuen Formatter hinzuzufügen, Möglichkeit 2 löscht einfach den XML-Formater.

Der WSDL-Service kann nun durch einen Klick auf „Debuggen“ gestartet werden.
Zum Testen eignet sich das Chrome-Addon „Advanced REST client“ [2].

Hier sieht man den Aufruf des Webservice durch den Advanced REST Client. Ggf. muss noch den Port in der URL angepasst werden.
In diesem Aufruf werden die Produkte mit den ID’s 1 und 3 abgerufen.

webapi-ws-5

Fazit

Wie man sieht ist es nicht schwer einen ASP.net Web API 2-Webservice zu erstellen.
Der nächste Teil dieser Serie widmet sich der Erstellung des Test-Clients als C#-Konsolen-Anwendung.

Links

[1] https://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api

[2] https://www.advancedrestclient.com

Schreibe einen Kommentar