最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解.NET?Core如何構(gòu)建一個(gè)彈性的HTTP請(qǐng)求機(jī)制

 更新時(shí)間:2025年01月22日 09:18:42   作者:代碼拾光  
在分布式系統(tǒng)中,服務(wù)間的依賴關(guān)系復(fù)雜,任何一個(gè)服務(wù)的故障都可能導(dǎo)致整個(gè)系統(tǒng)的不可用,這時(shí)彈性?HTTP?請(qǐng)求機(jī)制就可以幫助我們,下面我們就來看看.NET?Core如何構(gòu)建一個(gè)彈性的HTTP請(qǐng)求機(jī)制吧

1. 理解彈性 HTTP 請(qǐng)求機(jī)制

什么是彈性

彈性是指系統(tǒng)在面對(duì)故障或異常情況時(shí),能夠保持或快速恢復(fù)到正常狀態(tài)的能力。在 HTTP 請(qǐng)求的上下文中,彈性意味著當(dāng)請(qǐng)求失敗時(shí),系統(tǒng)能夠自動(dòng)采取一系列措施(如重試、降級(jí)、斷路等)來確保請(qǐng)求最終成功或優(yōu)雅地處理失敗。

為什么需要彈性 HTTP 請(qǐng)求機(jī)制

在分布式系統(tǒng)中,服務(wù)間的依賴關(guān)系復(fù)雜,任何一個(gè)服務(wù)的故障都可能導(dǎo)致整個(gè)系統(tǒng)的不可用。彈性 HTTP 請(qǐng)求機(jī)制可以幫助我們:

  • 提高系統(tǒng)的可用性:通過重試、斷路等策略,減少因瞬態(tài)故障導(dǎo)致的系統(tǒng)不可用。
  • 增強(qiáng)用戶體驗(yàn):通過快速恢復(fù)和優(yōu)雅降級(jí),減少用戶感知到的故障時(shí)間。
  • 降低運(yùn)維成本:通過自動(dòng)化處理故障,減少人工干預(yù)的需求。

彈性機(jī)制的核心原則

  • 重試(Retry):在請(qǐng)求失敗時(shí),自動(dòng)重試一定次數(shù)。
  • 斷路器(Circuit Breaker):當(dāng)失敗率達(dá)到一定閾值時(shí),暫時(shí)停止請(qǐng)求,避免雪崩效應(yīng)。
  • 超時(shí)(Timeout):設(shè)置請(qǐng)求的超時(shí)時(shí)間,避免長時(shí)間等待。
  • 降級(jí)(Fallback):當(dāng)請(qǐng)求失敗時(shí),提供備用的響應(yīng)或行為。
  • 負(fù)載均衡(Load Balancing):將請(qǐng)求分散到多個(gè)服務(wù)實(shí)例,避免單點(diǎn)故障。

2. .NET Core 中的 HTTP 請(qǐng)求基礎(chǔ)

HttpClient 的使用

在 .NET Core 中,HttpClient 是用于發(fā)送 HTTP 請(qǐng)求和接收 HTTP 響應(yīng)的主要類。以下是一個(gè)簡單的 HttpClient 使用示例:

using System;
using System.Net.Http;
using System.Threading.Tasks;

public class HttpClientApplication
{
    public static async Task Main(string[] args)
    {
        using (HttpClient client = new HttpClient())
        {
            // 發(fā)送 GET 請(qǐng)求
            HttpResponseMessage response = await client.GetAsync("https://******");
            if (response.IsSuccessStatusCode)
            {
                // 讀取響應(yīng)內(nèi)容
                string content = await response.Content.ReadAsStringAsync();
                Console.WriteLine(content);
            }
            else
            {
                // 輸出錯(cuò)誤狀態(tài)碼
                Console.WriteLine($"Error: {response.StatusCode}");
            }
        }
    }
}

HttpClientFactory 的引入

HttpClient 的直接使用存在一些問題,如 DNS 更新問題和套接字耗盡問題。為了解決這些問題,.NET Core 引入了 HttpClientFactory,它提供了更好的 HttpClient 生命周期管理和配置選項(xiàng)。

在 Startup.cs 中配置 HttpClientFactory

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // 注冊(cè) HttpClientFactory 并添加一個(gè)命名的 HttpClient
        services.AddHttpClient("ResilientClient", client =>
        {
            client.BaseAddress = new Uri("https://******"); // 設(shè)置基礎(chǔ)地址
            client.DefaultRequestHeaders.Add("Accept", "application/json"); // 設(shè)置默認(rèn)請(qǐng)求頭
        });
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        // 其他中間件配置
    }
}

在控制器或服務(wù)中使用 HttpClientFactory

using Microsoft.AspNetCore.Mvc;
using System.Net.Http;
using System.Threading.Tasks;

[ApiController]
[Route("[controller]")]
public class ResilientController : ControllerBase
{
    private readonly IHttpClientFactory _httpClientFactory;

    public ResilientController(IHttpClientFactory httpClientFactory)
    {
        _httpClientFactory = httpClientFactory;
    }

    [HttpGet]
    public async Task<IActionResult> Get()
    {
        // 通過名稱獲取 HttpClient 實(shí)例
        var client = _httpClientFactory.CreateClient("ResilientClient");

        // 發(fā)送 GET 請(qǐng)求
        var response = await client.GetAsync("posts/list");
        if (response.IsSuccessStatusCode)
        {
            var content = await response.Content.ReadAsStringAsync();
            return Ok(content); // 返回成功響應(yīng)
        }

        return StatusCode((int)response.StatusCode); // 返回錯(cuò)誤狀態(tài)碼
    }
}

優(yōu)點(diǎn):

  • 生命周期管理HttpClientFactory 自動(dòng)管理 HttpClient 的生命周期,避免套接字耗盡問題。
  • 配置靈活:可以為不同的 API 配置不同的 HttpClient 實(shí)例。
  • DNS 更新支持HttpClientFactory 會(huì)定期刷新 DNS 緩存。

3. 實(shí)現(xiàn)基本的重試機(jī)制

簡單的重試邏輯

在沒有使用任何庫的情況下,我們可以通過簡單的循環(huán)來實(shí)現(xiàn)重試邏輯:

public async Task<string> GetDataWithRetryAsync(int maxRetries = 3)
{
    int retryCount = 0;
    while (true)
    {
        try
        {
            // 發(fā)送 GET 請(qǐng)求
            HttpResponseMessage response = await _httpClient.GetAsync("data");
            response.EnsureSuccessStatusCode(); // 確保請(qǐng)求成功
            return await response.Content.ReadAsStringAsync(); // 返回響應(yīng)內(nèi)容
        }
        catch (HttpRequestException)
        {
            retryCount++;
            if (retryCount >= maxRetries)
            {
                throw; // 超過重試次數(shù)后拋出異常
            }
        }
    }
}

使用 Polly 實(shí)現(xiàn)重試策略

Polly 是一個(gè)流行的 .NET 彈性庫,提供了豐富的策略來實(shí)現(xiàn)重試、斷路、超時(shí)等功能。以下是一個(gè)使用 Polly 實(shí)現(xiàn)重試策略的示例:

using Polly;
using Polly.Retry;

public class RetryService
{
    private readonly HttpClient _httpClient;
    private readonly AsyncRetryPolicy<HttpResponseMessage> _retryPolicy;

    public RetryService(HttpClient httpClient)
    {
        _httpClient = httpClient;
        // 配置重試策略:最多重試 3 次,每次等待 2 秒
        _retryPolicy = Policy
            .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode) // 處理失敗響應(yīng)
            .Or<HttpRequestException>() // 處理請(qǐng)求異常
            .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); // 指數(shù)退避
    }

    public async Task<string> GetDataWithRetryAsync()
    {
        // 執(zhí)行重試策略
        HttpResponseMessage response = await _retryPolicy.ExecuteAsync(() => _httpClient.GetAsync("data"));
        response.EnsureSuccessStatusCode(); // 確保請(qǐng)求成功
        return await response.Content.ReadAsStringAsync(); // 返回響應(yīng)內(nèi)容
    }
}

重試策略的配置

Polly 允許我們靈活地配置重試策略,包括重試次數(shù)、重試間隔等。以下是一個(gè)配置指數(shù)退避重試策略的示例:

_retryPolicy = Policy
    .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
    .Or<HttpRequestException>()
    .WaitAndRetryAsync(5, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));

4. 處理瞬態(tài)故障

什么是瞬態(tài)故障

瞬態(tài)故障是指那些暫時(shí)性的、通常會(huì)自動(dòng)恢復(fù)的故障。例如,網(wǎng)絡(luò)抖動(dòng)、服務(wù)暫時(shí)不可用等。瞬態(tài)故障的特點(diǎn)是它們通常是短暫的,重試后可能會(huì)成功。

常見的瞬態(tài)故障類型

  • 網(wǎng)絡(luò)抖動(dòng):網(wǎng)絡(luò)連接不穩(wěn)定導(dǎo)致的請(qǐng)求失敗。
  • 服務(wù)暫時(shí)不可用:目標(biāo)服務(wù)因負(fù)載過高或維護(hù)而暫時(shí)不可用。
  • 資源限制:目標(biāo)服務(wù)因資源限制(如 CPU、內(nèi)存)而暫時(shí)無法處理請(qǐng)求。

使用 Polly 處理瞬態(tài)故障

Polly 提供了多種策略來處理瞬態(tài)故障,包括重試、斷路、超時(shí)等。以下是一個(gè)結(jié)合重試和斷路策略的示例:

  // 定義重試策略,當(dāng)HTTP請(qǐng)求失敗時(shí)進(jìn)行重試
  var retryPolicy = Policy
      .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
      .Or<HttpRequestException>()
      // 設(shè)置重試次數(shù)為3次,每次重試的間隔時(shí)間按指數(shù)遞增(2^retryAttempt秒)
      .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt)));

  // 定義熔斷策略,當(dāng)連續(xù)失敗次數(shù)達(dá)到閾值時(shí),熔斷一段時(shí)間
  var circuitBreakerPolicy = Policy
      .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
      .Or<HttpRequestException>()
      .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); // 設(shè)置熔斷條件:連續(xù)失敗5次后,熔斷30秒

  // 將重試策略和熔斷策略組合成一個(gè)綜合策略
  var combinedPolicy = Policy.WrapAsync(retryPolicy, circuitBreakerPolicy);

  HttpResponseMessage response = await combinedPolicy.ExecuteAsync(() => _httpClient.GetAsync("data"));

5. 實(shí)現(xiàn)斷路器模式

斷路器模式的概念

斷路器模式是一種用于防止系統(tǒng)因依賴服務(wù)故障而崩潰的設(shè)計(jì)模式。當(dāng)依賴服務(wù)的失敗率達(dá)到一定閾值時(shí),斷路器會(huì)打開,停止所有請(qǐng)求,直到依賴服務(wù)恢復(fù)。

使用 Polly 實(shí)現(xiàn)熔斷策略

Polly 提供了 CircuitBreaker 策略來實(shí)現(xiàn)熔斷策略。以下是一個(gè)使用 Polly 實(shí)現(xiàn)熔斷策略的示例:

var circuitBreakerPolicy = Policy
    .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
    .Or<HttpRequestException>()
    .CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)); // 連續(xù)失敗 5 次后,斷路器打開 30 秒

HttpResponseMessage response = await circuitBreakerPolicy.ExecuteAsync(() => _httpClient.GetAsync("data"));

配置熔斷策略參數(shù)

Polly 允許我們配置熔斷策略的參數(shù),包括失敗次數(shù)閾值、斷路時(shí)間等。以下是一個(gè)配置斷路器的示例:

var circuitBreakerPolicy = Policy
    .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
    .Or<HttpRequestException>()
    .CircuitBreakerAsync(
        exceptionsAllowedBeforeBreaking: 5, // 允許的失敗次數(shù)
        durationOfBreak: TimeSpan.FromSeconds(30) // 斷路時(shí)間
    );

6. 超時(shí)和超時(shí)策略

設(shè)置請(qǐng)求超時(shí)

在 HttpClient 中,我們可以通過 Timeout 屬性設(shè)置請(qǐng)求的超時(shí)時(shí)間:

_httpClient.Timeout = TimeSpan.FromSeconds(10); // 設(shè)置超時(shí)時(shí)間為 10 秒

使用 Polly 實(shí)現(xiàn)超時(shí)策略

Polly 提供了 Timeout 策略來實(shí)現(xiàn)超時(shí)控制。以下是一個(gè)使用 Polly 實(shí)現(xiàn)超時(shí)策略的示例:

var timeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(10)); // 設(shè)置超時(shí)時(shí)間為 10 秒

HttpResponseMessage response = await timeoutPolicy.ExecuteAsync(() => _httpClient.GetAsync("data"));

超時(shí)與重試的結(jié)合

我們可以將超時(shí)策略與重試策略結(jié)合使用,以應(yīng)對(duì)因超時(shí)導(dǎo)致的請(qǐng)求失?。?/p>

var retryPolicy = Policy
    .HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
    .Or<HttpRequestException>()
    .WaitAndRetryAsync(3, retryAttempt => TimeSpan.FromSeconds(Math.Pow(2, retryAttempt))); // 重試策略

var timeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(TimeSpan.FromSeconds(10)); // 超時(shí)策略

var combinedPolicy = Policy.WrapAsync(retryPolicy, timeoutPolicy); // 組合策略

HttpResponseMessage response = await combinedPolicy.ExecuteAsync(() => _httpClient.GetAsync("data"));

7. 負(fù)載均衡與請(qǐng)求分流

負(fù)載均衡的基本概念

負(fù)載均衡是指將請(qǐng)求分散到多個(gè)服務(wù)實(shí)例,以避免單點(diǎn)故障和提高系統(tǒng)的可擴(kuò)展性。常見的負(fù)載均衡策略包括輪詢、隨機(jī)、加權(quán)輪詢等。

在 .NET Core 中實(shí)現(xiàn)負(fù)載均衡

在 .NET Core 中,我們可以通過配置多個(gè) HttpClient 實(shí)例來實(shí)現(xiàn)負(fù)載均衡。以下是一個(gè)簡單的負(fù)載均衡示例:

public class LoadBalancer
{
    private readonly List<HttpClient> _httpClients;
    private readonly Random _random = new Random();

    public LoadBalancer(IHttpClientFactory httpClientFactory)
    {
        _httpClients = new List<HttpClient>
        {
            httpClientFactory.CreateClient("ServiceInstance1"), // 實(shí)例 1
            httpClientFactory.CreateClient("ServiceInstance2"), // 實(shí)例 2
            httpClientFactory.CreateClient("ServiceInstance3")  // 實(shí)例 3
        };
    }

    public async Task<string> GetDataAsync()
    {
        // 隨機(jī)選擇一個(gè) HttpClient 實(shí)例
        HttpClient client = _httpClients[_random.Next(_httpClients.Count)];
        HttpResponseMessage response = await client.GetAsync("data");
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadAsStringAsync();
    }
}

請(qǐng)求分流的策略

請(qǐng)求分流是指根據(jù)某些條件(如請(qǐng)求內(nèi)容、用戶身份等)將請(qǐng)求分發(fā)到不同的服務(wù)實(shí)例。以下是一個(gè)簡單的請(qǐng)求分流示例:

public async Task<string> GetDataAsync(string userId)
{
    // 根據(jù)用戶 ID 選擇不同的 HttpClient 實(shí)例
    HttpClient client = userId.StartsWith("A") ? _httpClients[0] : _httpClients[1];
    HttpResponseMessage response = await client.GetAsync("data");
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsStringAsync();
}

8. 監(jiān)控與日志記錄

監(jiān)控 HTTP 請(qǐng)求的重要性

監(jiān)控 HTTP 請(qǐng)求可以幫助我們及時(shí)發(fā)現(xiàn)和解決問題,確保系統(tǒng)的穩(wěn)定性和可靠性。常見的監(jiān)控指標(biāo)包括請(qǐng)求成功率、響應(yīng)時(shí)間、錯(cuò)誤率等。

使用 Application Insights 進(jìn)行監(jiān)控

Application Insights 是 Azure 提供的一個(gè)應(yīng)用性能管理服務(wù),可以幫助我們監(jiān)控和分析 HTTP 請(qǐng)求。以下是一個(gè)使用 Application Insights 監(jiān)控 HTTP 請(qǐng)求的示例:

public class HttpRemoteService
{
    private readonly HttpClient _httpClient;
    private readonly TelemetryClient _telemetryClient;

    public HttpRemoteService(HttpClient httpClient, TelemetryClient telemetryClient)
    {
        _httpClient = httpClient;
        _telemetryClient = telemetryClient;
    }

    public async Task<string> GetDataAsync()
    {
        var startTime = DateTime.UtcNow;
        var timer = System.Diagnostics.Stopwatch.StartNew();

        try
        {
            HttpResponseMessage response = await _httpClient.GetAsync("data");
            response.EnsureSuccessStatusCode();
            return await response.Content.ReadAsStringAsync();
        }
        catch (Exception ex)
        {
            _telemetryClient.TrackException(ex); // 記錄異常
            throw;
        }
        finally
        {
            timer.Stop();
            _telemetryClient.TrackDependency("HTTP", "GET", "data", startTime, timer.Elapsed, true); // 記錄依賴調(diào)用
        }
    }
}

日志記錄的最佳實(shí)踐

日志記錄是監(jiān)控和調(diào)試的重要工具。以下是一些日志記錄的最佳實(shí)踐:

  • 記錄關(guān)鍵信息:如請(qǐng)求 URL、響應(yīng)狀態(tài)碼、響應(yīng)時(shí)間等。
  • 使用結(jié)構(gòu)化日志:便于日志的查詢和分析。
  • 避免記錄敏感信息:如密碼、令牌等。
public async Task<string> GetDataAsync()
{
    _logger.LogInformation("正在發(fā)送 HTTP GET 請(qǐng)求到 {Url}", "https://api.*****.com/data");

    try
    {
        HttpResponseMessage response = await _httpClient.GetAsync("data");
        response.EnsureSuccessStatusCode();
        string content = await response.Content.ReadAsStringAsync();
        _logger.LogInformation("請(qǐng)求成功,響應(yīng)狀態(tài)碼: {StatusCode}", response.StatusCode);
        return content;
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, "請(qǐng)求失敗: {Message}", ex.Message);
        throw;
    }
}

到此這篇關(guān)于詳解.NET Core如何構(gòu)建一個(gè)彈性的HTTP請(qǐng)求機(jī)制的文章就介紹到這了,更多相關(guān)NET Core構(gòu)建HTTP請(qǐng)求機(jī)制內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • .NET或.NET Core Web APi基于tus協(xié)議實(shí)現(xiàn)斷點(diǎn)續(xù)傳的示例

    .NET或.NET Core Web APi基于tus協(xié)議實(shí)現(xiàn)斷點(diǎn)續(xù)傳的示例

    這篇文章主要介紹了.NET或.NET Core Web APi基于tus協(xié)議實(shí)現(xiàn)斷點(diǎn)續(xù)傳的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • 詳解ASP.NET Core3.0 配置的Options模式

    詳解ASP.NET Core3.0 配置的Options模式

    這篇文章主要介紹了詳解ASP.NET Core3.0 配置的Options模式,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • .net實(shí)現(xiàn)FTP傳輸文件的詳細(xì)教程

    .net實(shí)現(xiàn)FTP傳輸文件的詳細(xì)教程

    這篇文章介紹了兩種實(shí)現(xiàn).NET中FTP文件傳輸?shù)姆椒ǎ合到y(tǒng)方法手動(dòng)實(shí)現(xiàn)和使用開源的FluentFTP Nuget包,并通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2025-10-10
  • ASP.net Textbox的技巧使用

    ASP.net Textbox的技巧使用

    大家在做Web開發(fā)的時(shí)候,可能也會(huì)遇到之前我所遇到的問題,在使用TextBox控件時(shí),控件的邊緣不能被背景圖片完全覆蓋掉
    2011-09-09
  • .NET使用StackTrace獲取方法調(diào)用信息的代碼演示

    .NET使用StackTrace獲取方法調(diào)用信息的代碼演示

    StackTrace, 位于 System.Diagnostics 命名空間下,名字很直觀,它代表一個(gè)方法調(diào)用的跟蹤堆棧,里面存放著按順序排列的棧幀對(duì)象(StackFrame),每當(dāng)發(fā)生一次調(diào)用,就會(huì)壓入一個(gè)棧幀,這篇文章主要介紹了.NET使用StackTrace獲取方法調(diào)用信息,需要的朋友可以參考下
    2022-09-09
  • .NET裝飾模式講解

    .NET裝飾模式講解

    這篇文章主要為大家詳細(xì)介紹了ASP.NET裝飾模式的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-11-11
  • .NET Core中Object Pool的多種用法詳解

    .NET Core中Object Pool的多種用法詳解

    本文通過實(shí)例代碼給大家介紹了.NET Core中Object Pool的簡單使用 ,大概給大家提供了四種方法,每種方法都很經(jīng)典,需要的朋友可以參考下
    2018-09-09
  • asp.net 分頁顯示數(shù)據(jù)表的數(shù)據(jù)的代碼

    asp.net 分頁顯示數(shù)據(jù)表的數(shù)據(jù)的代碼

    asp.net顯示第一頁、上一頁、下一頁和最后一頁的分頁顯示數(shù)據(jù)表的數(shù)據(jù)
    2010-03-03
  • JavaScript系列之―同步還是異步?

    JavaScript系列之―同步還是異步?

    JavaScript系列之―同步還是異步?...
    2007-03-03
  • ASP.NET中動(dòng)態(tài)控制RDLC報(bào)表

    ASP.NET中動(dòng)態(tài)控制RDLC報(bào)表

    ASP.NET中動(dòng)態(tài)控制RDLC報(bào)表...
    2006-09-09

最新評(píng)論

凉山| 岳普湖县| 吴忠市| 和平区| 长寿区| 高密市| 类乌齐县| 佛冈县| 扶风县| 桂阳县| 云龙县| 芦溪县| 遵义县| 建阳市| 共和县| 红河县| 建湖县| 塘沽区| 浦城县| 太白县| 龙门县| 县级市| 扶绥县| 广河县| 龙门县| 信丰县| 霍山县| 德州市| 武夷山市| 泸西县| 伊金霍洛旗| 延庆县| 彰武县| 酉阳| 嘉义市| 和田市| 额济纳旗| 剑阁县| 鹤壁市| 房产| 甘谷县|