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__7
1.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.TaskAwaiter
1.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 设置所需的值
根据您的描述,您的代码没有问题,只是Azure配置有问题。如果您的应用程序闲置了一段时间,Azure 会卸载它。在大多数情况下,这是理想的行为:您不需要浪费您的申请计划资源。
您需要查看您的移动应用程序的 Always On 属性。默认情况下,此 属性 设置为 Off,但您需要将其设置为 On。
有几种方法可以做到:
- 如果您使用 CI/CD 管道来维护您的应用程序,请考虑 Web Sites 的 ARM 模板。转到 SiteConfig 对象,属性 alwaysOn
- 对于 powershell,在 official site
找到 -AppSettings
部分
- 或 Azure 门户用户界面。导航至您的 App Service/Application 设置 ,找到一个 Always On 开关。
已编辑
我想@Vladimir 的回答解释了同时发生的事情。
一段时间以来,我在使用 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__7
1.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.TaskAwaiter
1.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 设置所需的值
根据您的描述,您的代码没有问题,只是Azure配置有问题。如果您的应用程序闲置了一段时间,Azure 会卸载它。在大多数情况下,这是理想的行为:您不需要浪费您的申请计划资源。
您需要查看您的移动应用程序的 Always On 属性。默认情况下,此 属性 设置为 Off,但您需要将其设置为 On。
有几种方法可以做到:
- 如果您使用 CI/CD 管道来维护您的应用程序,请考虑 Web Sites 的 ARM 模板。转到 SiteConfig 对象,属性 alwaysOn
- 对于 powershell,在 official site 找到
- 或 Azure 门户用户界面。导航至您的 App Service/Application 设置 ,找到一个 Always On 开关。
-AppSettings
部分
已编辑
我想@Vladimir 的回答解释了同时发生的事情。