Azure 移动后端第一次查询失败

Azure Mobile Backend first query fails

一段时间以来,我在使用 Microsoft Azure 移动后端时遇到了一个奇怪的问题。通常第一个查询(自动用户检查)首先失败 运行,等待 30-60 秒后 returns 出错。出现此错误后,它可以完美运行。我大约每 24 小时遇到一次这个问题。

密码是:

第一步:初始化后端(以及与此后端相关的表之后)

Backend.Primary = 新后端("https://....azurewebsites.net");

第二步:失败的查询是

    public async Task<Tuple<Result, TeguUsers>> FindUserPC1NIC(string mac)
    {
        try
        {
            IMobileServiceTableQuery<TeguUsers> query = TeguUsersTable.Where(user => user.M1Mac1 == mac || user.M1Mac2 == mac );

            List<TeguUsers> result = await query.ToListAsync();

            return CreateFoundUsersResult(result);
        }
        catch (MobileServiceConflictException msce)
        {
            return new Tuple<Result, TeguUsers>(new Result("Failed [msce]", msce.Message), null);
        }
        catch (MobileServicePreconditionFailedException mspfe)
        {
            return new Tuple<Result, TeguUsers>(new Result("Failed [mspfe]", mspfe.Message), null);
        }
        catch (MobileServiceInvalidOperationException msioe)
        {
            return new Tuple<Result, TeguUsers>(new Result("Failed [msioe]", msioe.Message), null);
        }
        catch (MobileServiceODataException msode)
        {
            return new Tuple<Result, TeguUsers>(new Result("Failed [msode]", msode.Message), null);
        }

        catch (Exception ex)
        {
            return new Tuple<Result, TeguUsers>(new Result("Failed", ex.Message), null);
        }
    }

之前我是用一般异常,今天我添加了特定异常。

你能告诉我如何解决这个问题吗?

类似的异常信息是:

留言 无法完成请求。 (内部服务器错误)

要求 {Method: GET, RequestUri: 'https://....azurewebsites.net/tables/TeguUsers?$filter=(((((M1Mac1 eq '####') or (M1Mac2 eq '####')) or (M2Mac1 eq '# ###')) 或 (M2Mac2 eq '####')) 或 (M3Mac1 eq '####')) 或 (M3Mac2 eq '####'))&$top=1', 版本: 1.1, 内容: , Headers: { X-ZUMO-FEATURES:TT X-ZUMO-INSTALLATION-ID: 7a813fc5-f5cd-47ce-97a2-9b388cb3e159 接受:application/json User-Agent: ZUMO/4.0 User-Agent: (lang=Managed; os=Windows; os_version=6.2.0.9200; arch=Win32NT; version=4.0.1.0) X-ZUMO-VERSION: ZUMO/4.0 (lang=Managed; os=Windows; os_version=6.2.0.9200; arch=Win32NT; version=4.0.1.0) ZUMO-API-VERSION:2.0.0 }}

Request.Header {X-ZUMO-FEATURES:TT X-ZUMO-INSTALLATION-ID: 7a813fc5-f5cd-47ce-97a2-9b388cb3e159 接受:application/json User-Agent: ZUMO/4.0 (lang=Managed; os=Windows; os_version=6.2.0.9200; arch=Win32NT; version=4.0.1.0) X-ZUMO-VERSION: ZUMO/4.0 (lang=Managed; os=Windows; os_version=6.2.0.9200; arch=Win32NT; version=4.0.1.0) ZUMO-API-VERSION:2.0.0 }

Request.URI {https://....azurewebsites.net/tables/TeguUsers?$filter=(((((M1Mac1 eq '####') 或 (M1Mac2 eq '####')) 或 (M2Mac1 eq '####')) 或(M2Mac2 eq 'F0761C70A89B')) 或 (M3Mac1 eq '####')) 或 (M3Mac2 eq '####'))&$top=1}

回应 {StatusCode:500,ReasonPhrase:'Internal Server Error',版本:1.1,内容:System.Net.Http.StreamContent,Headers: { 日期:2017 年 10 月 20 日星期五 11:14:25 GMT Set-Cookie:ARRAffinity=3fb8a85fa49f4f848d3e147fa888c4fd566bdbdf451e7fccb0737b58d905c69c;路径=/;HttpOnly;域=....azurewebsites.net 服务器:Microsoft-IIS/8.0 X-Powered-By: ASP.NET Content-Length: 0 }}

堆栈跟踪 " at Microsoft.WindowsAzure.MobileServices.MobileServiceHttpClient.d__24.MoveNext()\r\n--- 从先前抛出异常的位置开始的堆栈跟踪结束 ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at Microsoft.WindowsAzure.MobileServices.MobileServiceHttpClient.d__26.MoveNext()\r\n--- 上一个堆栈跟踪结束抛出异常的位置 --- \r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 Microsoft.WindowsAzure.MobileServices.MobileServiceHttpClient。 d__18.MoveNext()\r\n--- 从先前抛出异常的位置开始的堆栈跟踪结束 ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at Microsoft.WindowsAzure.MobileServices.MobileServiceTable.d__20.MoveNext()\r\n--- 从抛出异常的先前位置开始的堆栈跟踪结束 --- \r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 Microsoft.WindowsAzure.MobileServices.MobileServiceTable.d__18.MoveNext()\r\n--- 从先前抛出异常的位置开始的堆栈跟踪结束 ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task )\r\n at Microsoft.WindowsAzure.MobileServices.Query.MobileServiceTableQueryProvider.d__81.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at Microsoft.WindowsAzure.MobileServices.Query.MobileServiceTableQueryProvider.<Execute>d__71.MoveNext()\r\n--- 从抛出异常的先前位置开始的堆栈跟踪结束 - --\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务 t ask)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task 任务)\r\n at Microsoft.WindowsAzure.MobileServices.Query.MobileServiceTableQuery1.<ToListAsync>d__33.MoveNext()\r\n--- End of stack trace from previous location where exception was thrown ---\r\n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n at System.Runtime.CompilerServices.TaskAwaiter1.GetResult()\r\n at Tegu.Azure.AMS.Table.TeguUsers.MST.d__11.MoveNext() 在 d:\Visual Studio Projects\TeguSolutions\TeguDev.Azure.AMS.Table.TeguUsers\Azure.AMS.Table.TeguUsers.cs: 第 144 行”

Microsoft Azure 移动后端使用 Windows 托管和 IIS 及其所有功能 - 其中之一是 IIS 应用程序池回收 - 默认情况下,如果应用程序池 dosen`未收到请求 - 它会卸载它处理的所有资源,并且为了恢复功能,它需要一分钟才能启动。为了避免此类问题,您应该能够控制托管服务器 IIS 或至少能够 运行 上面的脚本。

您需要 运行 Web 应用实例创建时的脚本:

空闲超时的默认值为 20 分钟 - 此脚本禁用应用程序池的睡眠模式:

  %windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.processModel.idleTimeout:00:00:00

此脚本禁用应用程序池的回收模式(默认 24 小时):

  %windir%\system32\inetsrv\appcmd set config -section:applicationPools -applicationPoolDefaults.recycling.periodicRestart.time:00:00:00

您也可以使用远程桌面访问实例,然后在 IIS 管理器中 UI 设置所需的值

Official site

根据您的描述,您的代码没有问题,只是Azure配置有问题。如果您的应用程序闲置了一段时间,Azure 会卸载它。在大多数情况下,这是理想的行为:您不需要浪费您的申请计划资源。

您需要查看您的移动应用程序的 Always On 属性。默认情况下,此 属性 设置为 Off,但您需要将其设置为 On

有几种方法可以做到:

  1. 如果您使用 CI/CD 管道来维护您的应用程序,请考虑 Web Sites 的 ARM 模板。转到 SiteConfig 对象,属性 alwaysOn
  2. 对于 powershell,在 official site
  3. 找到 -AppSettings 部分
  4. 或 Azure 门户用户界面。导航至您的 App Service/Application 设置 ,找到一个 Always On 开关。

已编辑

我想@Vladimir 的回答解释了同时发生的事情。