SharePoint Context in einem API Controller verwenden

Eine Provider-hosted SharePoint App ist letztendlich eine normale Webanwendung, die mit WebForms oder MVC erstellt werden kann. Daher ist es nur eine Frage der Zeit, bis der Wunsch entsteht einen WEB-API-Controller zu schreiben und diesen in der App zu nutzen. Dieser Schritt ist noch simpel. Unlängst wollte ich aber in der Controller-Funktion die aktuell angemeldeten User ermitteln.

Eigentlich sind es nur drei Zeilen Code:

var user = ctx.Web.CurrentUser;
ctx.Load(user, u => u.LoginName);
ctx.ExecuteQuery();

Die Tücke steckt aber im SharePoint-Kontext. In meinem Fall die Variable “ctx”.

In einer normalen WebForm-Klasse kann der Kontext mit den mitgelieferten SharePoint-Kontextklassen leicht erstellt werden.

var spContext = SharePointContextProvider.Current.GetSharePointContext(Context);

using (var ctx = spContext.CreateUserClientContextForSPHost())
{
...

Leider stehen uns diese Klassen in einem API-Controller nicht zur Verfügung und Microsoft hat die mitgelieferten Klassen noch nicht aktualisiert. Aber was Microsoft nicht erledigt, übernimmt die Community.

Bas Lijten hat sich des Themas angenommen und unter   http://blog.baslijten.com/getting-sharepoint-2013-apps-and-webapi-to-work/ ist seine Lösung nachzulesen. Er hat die SharePoint-Kontextklassen umgeschrieben, sodass diese auch in einem API Controller zur Verfügung stehen.

Mir waren es zu viele Dateien, die einzubinden sind, und daher habe ich alle Klassen in eine Datei kopiert. Die Datei kann hier heruntergeladen werden: Link zur Datei

Sobald diese Datei eingebunden ist und der Namespace in der Datei auf den Namespace der Anwendung gesetzt wurde, kann nun ein API Controller mit SharePoint-Kontext programmiert werden.

Die Klasse des Controllers muss mit dem Attribut “SharePointApiControllerContextFilter” versehen werden.

 [SharePointApiControllerContextFilter]
 public class QuartalTrainerController : ApiController
{
...

In der Methode des Controllers kann nun ein SharePoint Context gebildet werden und wie gehabt mit dem Client Object Model verwendet werden. Das Anfangsbeispiel, das Abfragen des aktuellen Users, sieht nun wie folgt aus:

public Goalsheet Get(string  Quartal)
{
      var spCtx = SharePointApiControllerContextProvider.Current.GetSharePointContext(this.ControllerContext);
 
       using (var ctx = spCtx.CreateUserClientContextForSPHost())
      {
          var user = ctx.Web.CurrentUser;
          ctx.Load(user, u => u.LoginName);
          ctx.ExecuteQuery();
...
Kommentare sind geschlossen