我们有一个好主意。NET 5 WebAPI项目,我们正在将其部署到运行Linux的Azure WebApp。
-
将查询包装到表存储中的存储库类
-
IClusterClient
,它使用表存储进行群集配置(即
Build()
客户机的初始化将检查表存储,以获取到思洛存储器的连接详细信息)
IClusterClient
和一个通用的
TableRepository<>
API控制器使用的。
var clientBuilder = new ClientBuilder()
.Configure<ClusterOptions>(options =>
{
options.ClusterId = "clusterId";
options.ServiceId = "serviceId";
})
.UseAzureStorageClustering(opts => opts.ConnectionString = "table_cnn_string");
var client = clientBuilder.Build(); // <-- this never returns, or times out
就在我们打电话的时候
clientBuilder.Build()
电话就是回不来了。信息技术
也许
Microsoft.Azure.Cosmos.Table
nuget包(最新版本-1.0.8)也有同样的问题。
这段代码:
var client = CloudStorageAccount.Parse("cnn_str").CreateCloudTableClient();
var cloudTable = client.GetTableReference("ATable");
if (!await cloudTable.ExistsAsync()) // <-- never returns or times out after 120 seconds
{
await cloudTable.CreateIfNotExistsAsync();
}
在我们呼叫的地方
cloudTable.ExistsAsync()
(或非异步变量)我们要么永不返回,要么在120秒后超时(我肯定能够跟踪这一次的超时)。
我的设想是:
-
从VS2022本地运行WebAPI,一切正常
-
从VS2022运行WebAPI,通过WSL2,一切正常
-
部署到Azure WebApp时
观察
例如,我们有一个用于监视的状态API端点,如下所示:
[ApiController]
public class StatusController : ControllerBase
{
private readonly ILogger<StatusController> _logger;
private readonly IClusterClient _clusterClient;
public StatusController(ILogger<StatusController> logger,
IClusterClient clusterClient)
{
_logger = logger;
_clusterClient = clusterClient;
}
[HttpGet]
public async Task<ActionResult<ApiStatusCheck>> GetStatus()
{
// ... bunch of other checks
try
{
_logger.LogInformation("SILO CHECK");
// there is no async version of this
var checkGrain = await _clusterClient.GetGrain<IStatusCheck>(1); //<-- never returns
_logger.LogInformation("SILO CHECK: got grain");
details = await checkGrain.GetStatus();
_logger.LogInformation($"SILO CHECK: got: {details}");
}
catch (Exception ex)
{
details = ex.Message;
}
// ... more checks, then return a response
}
因为除了Azure WebApp之外,我无法在其他任何地方重新创建此应用程序,而且我无法(据我所知)通过调试器连接到它(因为它在Linux上运行),我很难理解:
-
-
为什么它在本地工作而在部署时不工作
-
如何
真正地
诊断问题
-
奇怪的是,访问Azure Blob存储工作正常。
此外,重要的是,我不能放松对奥尔良客户的使用,因为这在内部依赖于
,简单地切换到其他API是不可能的。
谢谢你的帮助。