Tutorial/C# و.NET

أسعار الصرف في C# و.NET

أنشئ عميل .NET باستخدام IHttpClientFactory وdecimal والإلغاء والمهلة المحدودة.

MMexchangerate.dev·Jul 17, 2026·قراءة 6 دقائق

سجّل HttpClient منضبط الأنواع، واحقن المفتاح من الإعدادات، واقرأ الأسعار كـdecimal مع تمرير الإلغاء.

Key points
استخدم IHttpClientFactory.
اقرأ الأسعار كـdecimal.
مرر CancellationToken وضع مهلة.
نفذ EnsureSuccessStatusCode() قبل فك JSON.

سجّل HttpClient منضبط الأنواع

يضبط التسجيل العنوان وbearer token والمهلة، ويحافظ العميل على عقد الاستجابة والإلغاء.

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");
    }
}

مرر الإلغاء من الطلب

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();

خزّن الرصد الناجح فقط

خزّن الرصد الكامل مع Source وMarketSession وDataUpdatedAt، لا Rates["EUR"] وحده.

ضيّق سياسة الإعادة
أعد أخطاء الشبكة القصيرة وبعض 5xx فقط. لا تعامل 401 كمؤقت ولا تنشئ موجة بعد 429.
  • استخدم تسجيلا واحدا.
  • استخدم decimal.
  • مرر الإلغاء.
  • ارفض الأخطاء قبل فك البيانات.
MM
exchangerate.dev
أدلة تكامل للمطورين العاملين مع بيانات العملات.

Keep reading

Guideسلسلة أسعار تاريخية في طلب واحدRead Referenceقراءة source وmarket_sessionRead Guideالسعر الاسترشادي والتنفيذيRead