【问题标题】:Azure Mobile Backend first query failsAzure 移动后端第一次查询失败
【发布时间】:2018-05-12 23:10:44
【问题描述】:

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

代码是:

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

Backend.Primary = new Backend("https://....azurewebsites.net");

Step2:查询失败是

    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);
        }
    }

之前我用的是一般异常,今天我添加了具体的异常。

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

  • 更改我的代码中的任何内容?

  • 在后端更改任何内容?

  • 还有什么更高级的调试技术?

类似的异常消息是:

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

请求 {方法: GET, RequestUri: 'https://....azurewebsites.net/tables/TeguUsers?$filter=(((((((M1Mac1 eq '####') 或 (M1Mac2 eq '####'))) 或 (M2Mac1 eq '### #')) 或 (M2Mac2 eq '####')) 或 (M3Mac1 eq '####')) 或 (M3Mac2 eq '####'))&$top=1',版本:1.1 , 内容: , 标题: { X-ZUMO-特点:TT X-ZUMO-安装 ID:7a813fc5-f5cd-47ce-97a2-9b388cb3e159 接受:应用程序/json 用户代理: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 版本:2.0.0 }}

Request.Header {X-ZUMO-特点:TT X-ZUMO-安装 ID:7a813fc5-f5cd-47ce-97a2-9b388cb3e159 接受:应用程序/json 用户代理: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 版本:2.0.0 }

请求.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:“内部服务器错误”,版本:1.1,内容:System.Net.Http.StreamContent,标头: { 日期:格林威治标准时间 2017 年 10 月 20 日星期五 11:14:25 设置 Cookie:ARRAffinity=3fb8a85fa49f4f848d3e147fa888c4fd566bdbdf451e7fccb0737b58d905c69c;Path=/;HttpOnly;Domain=....azurewebsites.net 服务器:Microsoft-IIS/8.0 X-Powered-By: ASP.NET 内容长度:0 }}

堆栈跟踪 " 在 Microsoft.WindowsAzure.MobileServices.MobileServiceHttpClient.d__24.MoveNext()\r\n--- 从先前引发异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (任务任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 Microsoft.WindowsAzure.MobileServices.MobileServiceHttpClient.d__26.MoveNext()\r\n--- 堆栈结束从先前引发异常的位置跟踪 ---\r\n System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)\r\n System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\ n 在 Microsoft.WindowsAzure.MobileServices.MobileServiceHttpClient.d__18.MoveNext()\r\n--- 从先前引发异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (任务任务)\r\n 在 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 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\r\n 在 System.Runtime.CompilerServices。 TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n 在 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.&lt;Execute&gt;d__71.MoveNext()\r\n--- 堆栈跟踪从先前引发异常的位置结束 - --\r\n 在 System.Runtime.CompilerServices.Tas kAwaiter.ThrowForNonSuccess(任务任务)\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 Microsoft.WindowsAzure.MobileServices.Query.MobileServiceTableQuery1.&lt;ToListAsync&gt;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 在 d:\Visual Studio Projects\TeguSolutions\TeguDev.Azure.AMS.Table.TeguUsers\Azure.AMS.Table.TeguUsers.cs:line 中的 Tegu.Azure.AMS.Table.TeguUsers.MST.d__11.MoveNext() 144"

【问题讨论】:

    标签: c# azure azure-mobile-services


    【解决方案1】:

    Microsoft Azure 移动后端使用 Windows 托管和 IIS 及其所有功能 - 其中之一是 IIS 应用程序池回收 - 默认情况下,如果应用程序池未收到请求 - 它会卸载所有资源它处理并为了恢复功能需要大约一分钟才能启动。为了避免此类问题,您应该能够控制托管服务器 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

    【讨论】:

      【解决方案2】:

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

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

      有几种方法可以做到:

      1. 如果您使用 CI/CD 管道来维护您的应用程序,请考虑使用Web Sites 的 ARM 模板。转到 SiteConfig 对象,属性 alwaysOn
      2. 对于 powershell,请在 official site 找到 -AppSettings 部分
      3. 或 Azure 门户用户界面。导航到您的应用服务/应用程序设置,找到一个始终开启切换器。

      已编辑

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

      【讨论】:

      • 谢谢你,是的,你让我明白了,为我节省了很多时间。经过 1 天的测试,看起来一切正常。
      猜你喜欢
      • 2020-10-15
      • 2021-12-23
      • 1970-01-01
      • 1970-01-01
      • 2016-12-22
      • 2016-05-27
      • 2019-01-31
      • 2017-03-31
      • 2011-05-21
      相关资源
      最近更新 更多