İlan 2 — SharePoint / .NET
İlan 2 · İlan 2

SharePoint + .NET — sıfırdan zihin haritası

Bunu gerçekten hiç bilmiyormuşsun gibi ele alıyorum. Amaç uzman olmak değil, mülakatta "bu kavramları biliyorum, üretimde derinleşmeye hazırım" diyebilmek.

💡
Önce büyük resimSharePoint, Microsoft'un kurumsal içerik yönetimi + intranet + doküman paylaşımı platformu — .NET Framework üzerine kurulu, IIS'te çalışan dev bir web uygulaması. "Liste" (Excel tablosu gibi ama web'de, workflow'lu), "site koleksiyonu" ve "doküman kütüphanesi" temel yapı taşları.

1. C#/.NET tazeleme

Sen zaten production'da C# yazdın — sözdizimi hafızanda hızlıca geri gelecek. Modern C#'ta en çok göreceğin kalıp: interface + async/await + dependency injection.

FaturaServisi.cs
public interface IFaturaServisi
{
    Task<Fatura> GetFaturaAsync(int musteriId);
}

public class FaturaServisi : IFaturaServisi
{
    private readonly HttpClient _client;
    public FaturaServisi(HttpClient client) => _client = client;

    public async Task<Fatura> GetFaturaAsync(int musteriId)
    {
        var response = await _client.GetAsync($"/api/faturalar/{musteriId}");
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadFromJsonAsync<Fatura>();
    }
}

2. SharePoint REST API

Her SharePoint sitesi /_api/ altında bir REST arayüzü sunar. Kaynaklar (liste, öğe, kullanıcı) OData tarzı URL'lerle adreslenir.

// GET — bir listedeki öğeleri oku
fetch(`${siteUrl}/_api/web/lists/getbytitle('Duyurular')/items`, {
  headers: { Accept: "application/json;odata=verbose" },
})
  .then(r => r.json())
  .then(data => console.log(data.d.results));

// POST — yeni öğe ekle. X-RequestDigest ZORUNLU (CSRF koruması)
fetch(`${siteUrl}/_api/web/lists/getbytitle('Duyurular')/items`, {
  method: "POST",
  headers: {
    Accept: "application/json;odata=verbose",
    "Content-Type": "application/json;odata=verbose",
    "X-RequestDigest": digestValue, // önce ayrı bir çağrıyla alınır
  },
  body: JSON.stringify({
    __metadata: { type: "SP.Data.DuyurularListItem" },
    Title: "Yeni duyuru",
  }),
});

3. Webhook & Workflow

Webhook: bir SharePoint listesi değiştiğinde senin servisine "bir şey değişti" diye haber gönderir (push). Workflow: "bir öğe eklendiğinde onay maili gönder" gibi iş süreçlerini kod yazmadan (Power Automate / SharePoint Designer ile) tanımlamandır.

// Bir SharePoint listesindeki değişiklikleri dinlemek için abone ol
POST https://tenant.sharepoint.com/sites/intranet/_api/web/lists('{list-id}')/subscriptions
{
  "resource": "https://tenant.sharepoint.com/sites/intranet/_api/web/lists('{list-id}')",
  "notificationUrl": "https://myapp.azurewebsites.net/api/notify",
  "expirationDateTime": "2026-12-01T00:00:00Z"
}
// SharePoint bu listede DEĞİŞİKLİK olunca notificationUrl'e POST atar.
// Dikkat: içerik GÖNDERMEZ, sadece "bir şey değişti" der — sen tekrar GET ile çekersin.

4. Farm mimarisi & servisler

BileşenNe işe yarar
WFE (Web Front End)Kullanıcı HTTP isteklerini karşılayan sunucular — IIS burada çalışır
Application serverSearch, User Profile gibi "service application"ları çalıştırır
SQL Server (content DB)Tüm liste/doküman/metadata verisi burada saklanır
Search ServiceSite koleksiyonlarındaki içeriği indeksler, arama sorgularını cevaplar
Distributed CacheOturum/sayfa verisini WFE'ler arasında paylaşılan bir cache'te tutar → hız
Managed Metadata ServiceMerkezi taksonomi/terim deposu — tüm sitelerde tutarlı etiketleme (ör. "Departman" listesi hep aynı)

5. PowerShell ile yönetim

Site/servis yönetimi genelde UI'dan değil, script'lenebilir PowerShell cmdlet'leriyle yapılır.

# SharePoint Management Shell
Get-SPSite -Limit All | Select Url, ContentDatabase
New-SPWeb -Url "https://intranet/sites/ik/yeni-sayfa" -Template "STS#0"
Get-SPServiceApplication | Where { $_.TypeName -like "*Search*" }
Restart-Service SPTimerV4   # SharePoint zamanlanmış görev servisini yeniden başlat

6. WCF & SOAP

WCF (Windows Communication Foundation), .NET'in servis oluşturma çatısı — SOAP (XML tabanlı, katı sözleşmeli) veya REST olarak servis açabilir. Modern .NET'te yerini büyük ölçüde ASP.NET Core Web API'ye bıraktı ama SharePoint'in eski entegrasyonlarında hâlâ karşına çıkar.

[ServiceContract]
public interface IFaturaService
{
    [OperationContract]
    Fatura GetFatura(int musteriId);
}

public class FaturaService : IFaturaService
{
    public Fatura GetFatura(int musteriId) => _repo.Bul(musteriId);
}
// WCF, bu servisi SOAP (XML tabanlı, katı şema) veya REST olarak dışarı açabilir.
// SharePoint'in eski sürümlerinde iç servisler hâlâ WCF/SOAP tabanlıdır.
⚠️
SOAP vs REST — 1 cümlelik farkSOAP: katı XML şeması, işlem (RPC) odaklı, ağır. REST: kaynak (resource) odaklı, JSON ağırlıklı, HTTP fiillerini (GET/POST/PUT/DELETE) anlamlı kullanır, daha hafif.

7. Kafka (tercihen) & AI (senin gerçek farkın)

Kafka, servisler arası asenkron mesajlaşma için bir event log'tur — "fatura ödendi" olayını üreten servis, onu dinleyen tüm servislere (bildirim, raporlama) tek tek bağlanmadan ulaştırır. İlan bunu "tercihen" işaretlemiş, derinlemesine bilmen beklenmiyor — kavramı tanıman yeterli.

💡
Burada rakiplerinin çoğundan öndesinİlan "tercihen AI konularında bilgi sahibi olmak" diyor — bu senin CV'ndeki en güçlü alan (OpenAI/Gemini/Claude entegrasyonları, agent tasarımı). Mülakatta bunu öne çıkar: "SharePoint'in arama deneyimini semantic/AI destekli hale getirme, workflow'lara LLM tabanlı otomasyon ekleme gibi konularda somut deneyimim var" cümlesi, SharePoint'teki eksiğini fazlasıyla dengeler.

Egzersizler

1) Bir SharePoint listesine yeni öğe eklerken neden önce ayrı bir istekle 'X-RequestDigest' alman gerekiyor?
CSRF (Cross-Site Request Forgery) korumasıdır — SharePoint, her değiştirici (POST/PUT/DELETE) isteğinde geçerli, süresi dolmamış bir digest token'ı zorunlu kılar. Bu, bir saldırganın kullanıcı adına farkında olmadan istek göndermesini engeller — REST API'lerde çok görülen bir güvenlik kalıbıdır (ör. Django'nun CSRF token'ı, Rails'in authenticity token'ı ile aynı fikir).
2) Webhook ile 'polling' (belirli aralıklarla API'yi sürekli kontrol etmek) arasındaki fark nedir, neden webhook tercih edilir?
Polling'de sen her N saniyede bir "değişiklik var mı?" diye sorarsın — çoğu istek boşa gider, gecikme ile değişikliği fark edersin, sunucuya gereksiz yük binersin. Webhook'ta sunucu değişiklik OLDUĞUNDA seni haberdar eder (push) — anlık, verimli. Bedeli: senin tarafında bir HTTP endpoint'i her zaman ayakta ve erişilebilir tutman gerekir.