Service Fabric 中的 WebAPI
将 ASP.NET WebAPI 代码迁移到 Service Fabric 群集
引言
要了解 Service Fabric,一个好的起点是 这里。
注意:该应用程序已从 Azure 中移除。请下载代码并在本地群集中运行它。
背景
本文基于 本文,您可以在其中找到原始的 CarClient
和 CarAPI
项目,在本文中,这些项目已迁移到 Service Fabric 群集。
Using the Code
在本地群集中部署和运行此应用程序之前,请确保您的计算机上没有使用 https://:80 和 https://:83。如果 https://:80 已被使用,请在 CarClient
的 ServiceManifest.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 取代,CarClient
和 CarAPI
项目现在是无状态的 Service Fabric 服务。
要通过 Visual Studio 创建此解决方案,已选择 Service Fabric Application 作为解决方案模板。
在解决方案中,添加了两个无状态的 ASP.NET Core 项目:一个 WebAPI
项目和一个 Web 应用程序,如下所示:
代码从旧的 CarAPI
和 CarClient
被添加到默认项目中,修改尽可能少。该解决方案可以在 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
传递,该变量在 CarClient
的 ServiceManifest.xml 中定义。在本地运行应用程序或在 Azure 中运行时如何定义值,可以在 ApplicationParameters 文件夹中的 Cloud.xml 和 Local1.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}/");
}
}
此代码位于项目 CarClient
的 Utils.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 日:初始版本