我有一段时间与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;
答案 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中设置所需的值
答案 1 :(得分:1)
根据您的描述,您的代码没有问题,但仅适用于Azure配置。如果应用程序闲置一段时间,Azure将卸载您的应用程序。在大多数情况下,这是理想的行为:您不需要浪费应用计划资源。
您需要查看移动应用的始终开启属性。默认情况下,此属性设置为关闭,但您需要将其设置为开启。
有几种方法可以做到:
-AppSettings
部分
<强> EDITED 强>
我想@ Vladimir的回答同时解释了幕后发生的事情。