代码之家  ›  专栏  ›  技术社区  ›  Brendan Green

Azure表存储-调用超时/从不从返回。运行在Azure WebApp(Linux)上的NET 5 WebAPI

  •  0
  • Brendan Green  · 技术社区  · 3 年前

    我们有一个好主意。NET 5 WebAPI项目,我们正在将其部署到运行Linux的Azure WebApp。

    1. 将查询包装到表存储中的存储库类
    2. 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是不可能的。

    谢谢你的帮助。

    0 回复  |  直到 3 年前
    推荐文章