SharePoint Development
Real SharePoint development problems in C#: provisioning, list items, navigation, content types and the API costs nobody warns you about.
Every topic on this blog, from SharePoint CSOM performance to Azure Event Grid, each with the posts that go deepest on it.
Thirty-odd posts, grouped by the problem they solve rather than the month I wrote them. The bigger clusters have a starting point marked; the smaller ones are just the posts I have so far.
Real SharePoint development problems in C#: provisioning, list items, navigation, content types and the API costs nobody warns you about.
Everything on this blog written in C#: Microsoft Graph and CSOM client code, Azure Functions, reflection tricks, and the .NET side of Microsoft 365.
Batching, CAML joins, change detection and ExceptionHandlingScope: how to stop SharePoint CSOM making tens of thousands of API calls it never needed to make.
Microsoft Graph from .NET: batching and mapping responses back to requests, rich notifications, throttling, and the SDK behaviour the docs leave out.
Making Microsoft 365 APIs faster and cheaper: batching, caching, ETags, change detection, and what a wasted API call actually costs you.
Azure Functions as the backend for Microsoft 365 work: proxies that hide tokens, blob caching with 304s, Event Grid handlers and long-running provisioning.
Durable Functions in practice: checkpointing, idempotent activities, deterministic instance IDs, and telling a permanent failure from a transient one.
Outlook add-ins that survive mobile: requirement sets that lie about their version, Nested App Auth without a popup, and falling back to Microsoft Graph.
Getting a token and keeping it safe: MSAL and Nested App Auth, PnP.Framework and Graph SDK auth, Easy Auth, and keeping third-party keys out of the browser.
Provisioning SharePoint sites that survive contact with reality: PnP templates, eventual consistency, navigation, content types and Durable orchestrations.
Working with the PnP libraries: template sizing and resilience, authentication, nested navigation, and what is still missing in PnP.Core.
Change notifications from Microsoft 365: rich notifications that carry their own metadata, validating and decrypting payloads, and debouncing users who cannot stop clicking save.
What happens when Microsoft 365 says 429: smart retry logic that is not just retrying everything, Retry-After, and testing your limits before production does.
Using Dev Proxy to break Microsoft 365 APIs on purpose: simulating throttling and failures locally so you find out before your users do.
Reflection and custom attributes in C#: logging without boilerplate, mapping entities to lists, and generating audit trails from type metadata.