Tutorial/C# ve .NET

C# ve .NET ile döviz kurları

IHttpClientFactory, decimal, iptal, sınırlı zaman aşımı ve kaynak bilgisini koruyan yanıt işlemeyle tipli bir .NET FX istemcisi kurun.

ERexchangerate.dev·Jul 17, 2026·6 dk okuma

Tipli HttpClient kaydedin, anahtarı yapılandırmadan alın ve kurları decimal olarak çözümleyin. İptali çağrı boyunca iletin.

Key points
IHttpClientFactory kullanın.
Kurları decimal olarak okuyun.
CancellationToken ve zaman aşımı kullanın.
Çözümlemeden önce EnsureSuccessStatusCode() çağırın.

Tipli HttpClient kaydedin

Kayıt temel URL, bearer token ve zaman aşımını yönetir. İstemci yanıt sözleşmesini ve iptali korur.

csharp · Program.cs and FxClient.cscopy
// Program.cs
using System.Net.Http.Headers;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddHttpClient<FxClient>(client =>
{
    var key = builder.Configuration["EXCHANGERATE_API_KEY"]
        ?? throw new InvalidOperationException("EXCHANGERATE_API_KEY is missing");

    client.BaseAddress = new Uri("https://api.exchangerate.dev/v1/");
    client.DefaultRequestHeaders.Authorization =
        new AuthenticationHeaderValue("Bearer", key);
    client.Timeout = TimeSpan.FromSeconds(5);
});

// FxClient.cs
using System.Net.Http.Json;
using System.Text.Json.Serialization;

public sealed record LatestRates(
    string Base,
    string Source,
    [property: JsonPropertyName("market_session")] string MarketSession,
    [property: JsonPropertyName("data_updated_at")] DateTimeOffset DataUpdatedAt,
    Dictionary<string, decimal> Rates
);

public sealed class FxClient(HttpClient http)
{
    public async Task<LatestRates> GetLatestAsync(
        string baseCurrency,
        CancellationToken cancellationToken)
    {
        using var response = await http.GetAsync(
            $"latest/{baseCurrency}?symbols=EUR,GBP",
            cancellationToken);

        response.EnsureSuccessStatusCode();

        return await response.Content.ReadFromJsonAsync<LatestRates>(
            cancellationToken: cancellationToken)
            ?? throw new InvalidOperationException("Empty FX response");
    }
}

İptali istekten iletin

csharp · endpoint usagecopy
var app = builder.Build();

app.MapGet("/fx", async (
    FxClient fx,
    CancellationToken cancellationToken) =>
{
    var rates = await fx.GetLatestAsync("USD", cancellationToken);

    return Results.Ok(new {
        eur = rates.Rates["EUR"],
        rates.Source,
        rates.MarketSession,
        rates.DataUpdatedAt,
    });
});

app.Run();

Yalnızca başarılı gözlemleri önbelleğe alın

Yalnızca Rates["EUR"] değil, Source, MarketSession ve DataUpdatedAt içeren tam gözlemi saklayın.

Yinelemeyi dar tutun
Kısa ağ hatalarını ve seçili 5xx yanıtlarını yineleyin. 401 veya 429 için yineleme fırtınası oluşturmayın.
  • Tek istemci kaydı kullanın.
  • decimal kullanın.
  • İptali iletin.
  • Hataları çözümlemeden önce reddedin.
ER
exchangerate.dev
FX verileriyle çalışan geliştiriciler için entegrasyon rehberleri.

Okumaya devam edin

GuideTek çağrıda geçmiş FX zaman serisiOku Referencesource ve market_session alanlarını okumaOku GuideGösterge ve uygulanabilir FX kurlarıOku
Daha Fazla KarşılaştırmaFixer vs exchangerate.devOpen Exchange Rates vs exchangerate.devCurrencylayer vs exchangerate.dev
ÖğrenReading source and market_session in your pipelineIndicative vs executable FX rates: what a rates API actually gives youECB reference rates, explained
Canlı KurlarEUR/USDGBP/USDUSD/JPY