Eine Provider-hosted SharePoint App ist letztendlich eine normale Webanwendung, die mit WebForms oder MVC erstellt werden kann. Daher ist 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 3 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 Kontekt mit den mitgelieferten SharePoint Kontext Klassen 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 Litjen 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 Context Klassen umgeschrieben sodaß diese auch in einem API Controller zur Verfügung zu 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 Attribute “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();
...