Azure移动后端首次查询失败

时间:2017-11-29 09:37:24

标签: c# azure azure-mobile-services

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

代码是:

步骤1:初始化后端(以及带有此后端的相关表之后)

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

步骤2:失败的查询是

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

在我使用普通Exception之前,今天我添加了特定的Exceptions。

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

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

  • 在后端更改任何内容?

  • 还有其他更先进的调试技术吗?

类似的异常消息是:

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

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

响应 {StatusCode:500,ReasonPhrase:&#39;内部服务器错误&#39;,版本:1.1,内容:System.Net.Http.StreamContent,标头: {   日期:2017年10月20日星期五,格林威治标准时间11:14:25   Set-Cookie:ARRAffinity = 3fb8a85fa49f4f848d3e147fa888c4fd566bdbdf451e7fccb0737b58d905c69c; Path = /; HttpOnly; Domain = .... azurewebsites.net   服务器:Microsoft-IIS / 8.0   X-Powered-By:ASP.NET   内容长度:0 }}

栈跟踪 &#34;在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(任务任务)\ r \ n在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\ r \ n在Microsoft.WindowsAzure.MobileServices.MobileServiceHttpClient.d__18.MoveNext()\ r \ n ---从抛出异常的上一个位置的堆栈跟踪结束--- \ r \ n在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\ r \ n在System.Runtime.CompilerServices.Task Awaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\ r \ n在Microsoft.WindowsAzure.MobileServices.MobileServiceTable.d__20.MoveNext()\ r \ n ---从前一个引发异常的位置的堆栈跟踪结束--- \ r \ n at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\ r \ n在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\ r \ n在Microsoft.WindowsAzure.MobileServices.MobileServiceTable.d__18.MoveNext() \ r \ n ---从抛出异常的上一个位置开始的堆栈跟踪结束---在System.Runtime.CompilerServices上的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)\ r \ n中的\ r \ n。 TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\ r \ n在Microsoft.WindowsAzure.MobileServices.Query.MobileServiceTableQueryProvider.d__8 1.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__7 1.MoveNext()\ r \ n ---从前一个位置的堆栈跟踪结束,其中异常是抛出--- \ r \ n在System.Runtime.CompilerServices.TaskAwaiter.T hrowForNonSuccess(任务任务)\ r \ n在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\ r \ n在Microsoft.WindowsAzure.MobileServices.Query.MobileServiceTableQuery 1.<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.TaskAwaiter 1.GetResult()\ r \ n在Tegu.Azure.AMS.Table.TeguUsers.MST.d__11.MoveNext()的d:\ Visual Studio Projects \ TeguSolutions \ TeguDev.Azure.AMS.Table.TeguUsers \ Azure.AMS.Table.TeguUsers.cs:line 144&#34;

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

您需要查看移动应用的始终开启属性。默认情况下,此属性设置为关闭,但您需要将其设置为开启

有几种方法可以做到:

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

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