65.9K
CodeProject 正在变化。 阅读更多。
Home

Service Fabric 中的 WebAPI

starIconstarIconstarIconemptyStarIconemptyStarIcon

3.00/5 (4投票s)

2018年5月7日

CPOL

3分钟阅读

viewsIcon

30144

downloadIcon

403

将 ASP.NET WebAPI 代码迁移到 Service Fabric 群集

引言

要了解 Service Fabric,一个好的起点是 这里

注意:该应用程序已从 Azure 中移除。请下载代码并在本地群集中运行它。

背景

本文基于 本文,您可以在其中找到原始的 CarClientCarAPI 项目,在本文中,这些项目已迁移到 Service Fabric 群集。

Using the Code

在本地群集中部署和运行此应用程序之前,请确保您的计算机上没有使用 https://:80 和 https://:83。如果 https://:80 已被使用,请在 CarClientServiceManifest.xml 中更改为其他可用端口。例如,要使用端口 8080,请写入

 <Endpoint Protocol="http" Name="ServiceEndpoint" Type="Input" Port="8080" />

然后,在浏览器中通过 https://:8080 启动程序。

请注意,此代码仅在 Google Chrome 上进行过测试。客户端中的 JavaScript 在 Google Chrome 上运行良好,但在 Internet Explorer 和 FireFox 中遇到了一些问题。

要运行此示例,您需要一个 Azure 帐户以及您自己的 Azure SQL Server 应用程序。您必须更新连接字符串以指向您自己的 Azure SQL Server。您还需要 Service Fabric Explorer 和 Service Fabric Cluster Manager,这些都可以在安装 Service Fabric SDK 时获得。

SQLite 已被 Azure SQL Server 取代,CarClientCarAPI 项目现在是无状态的 Service Fabric 服务。

要通过 Visual Studio 创建此解决方案,已选择 Service Fabric Application 作为解决方案模板。

在解决方案中,添加了两个无状态的 ASP.NET Core 项目:一个 WebAPI 项目和一个 Web 应用程序,如下所示:

代码从旧的 CarAPICarClient 被添加到默认项目中,修改尽可能少。该解决方案可以在 Azure 群集和本地群集中运行。Azure 群集由 Visual Studio 创建。从 Visual Studio 创建 SF 群集时,您将获得一个使用证书安全的群集。这会强制应用程序在 Azure 中为反向代理使用https,而在本地运行时则必须使用http

在 Azure 中,用于 CarAPI 的 URL 是 http://carfabric.northeurope.cloudapp.azure.com:83/,在本地群集中,使用的 URL 是 https://:83/CarClient 中的 JavaScript 使用此 URL 来检索和更新数据库中的数据。您可以在本地群集中使用 https://:83/swagger 来检查 CarAPI

对于 CarClient,使用的 URL 与 CarAPI 相同,只是端口号更改为 80。URL 通过环境变量 ApiAddressConnectionString 传递,该变量在 CarClientServiceManifest.xml 中定义。在本地运行应用程序或在 Azure 中运行时如何定义值,可以在 ApplicationParameters 文件夹中的 Cloud.xmlLocal1.xml 中看到。用于获取反向代理地址的代码如下:

/// <summary>
/// Constructs a reverse proxy URL for a given service
/// Example: https://:19081/CarFabric/CarAPI/
/// </summary>
///<param name="serviceName"></param>
/// <returns></returns>
public static Uri GetProxyAddress(Uri serviceName)
{
    string ApiAddress = Environment.GetEnvironmentVariable("ApiAddressConnectionString");
    if (ApiAddress.IndexOf("localhost") > 0)
    {
        return new Uri($"https://:19081{serviceName.AbsolutePath}/");
    }
    else
    {
        return new Uri($"https://:19081{serviceName.AbsolutePath}/");
    }
}

此代码位于项目 CarClientUtils.cs 文件中。

比较旧的传统解决方案和 Service Fabric 解决方案之间的 HTTP Client 代码,可以清楚地看到差异。

新的 Service Fabric 代码

namespace CarClient
{
    public static class Utils
    {
        public static async Task<T> Get<T>(string url)
        {
            Uri serviceName = CarClientApp.GetCarAPIServiceName();
            Uri proxyAddress = GetProxyAddress(serviceName);
            HttpClientHandler handler = new HttpClientHandler()
            {
                ServerCertificateCustomValidationCallback = 
                      HttpClientHandler.DangerousAcceptAnyServerCertificateValidator
            };
            using (var client = new HttpClient(handler) { BaseAddress = proxyAddress })
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add
                         (new MediaTypeWithQualityHeaderValue("application/json"));
                var response = await client.GetAsync(url);
                var content = await response.Content.ReadAsStringAsync();
                return await Task.Run(() => JsonConvert.DeserializeObject<T>(content));
            }
        }

旧代码如下:

namespace CarClient
{
    public static class Utils
    {
        private static readonly Uri Endpoint = new Uri("https://:54411//");
        public static async Task<T> Get<T>(string url)
        {
             using (var client = new HttpClient() { BaseAddress = EndPoint })
            {
                client.DefaultRequestHeaders.Accept.Clear();
                client.DefaultRequestHeaders.Accept.Add
                            (new MediaTypeWithQualityHeaderValue("application/json"));
                var response = await client.GetAsync(url);
                var content = await response.Content.ReadAsStringAsync();
                return await Task.Run(() => JsonConvert.DeserializeObject<T>(content));
            }
        }

有关实现细节,请下载 CarFabric.zip 并阅读代码。

关注点

从 Visual Studio 创建 SF 群集时,您将获得一个使用证书安全的群集。这会强制应用程序在 Azure 中为反向代理使用https,而在本地运行时则必须使用http

历史

  • 2018 年 5 月 8 日:初始版本
© . All rights reserved.