Azure 服务器在一定数量的 API 调用后抛出异常
Azure server throwing exception after certain numbers of API call
我创建了一个 API (MVC) 并将其托管在 Azure 服务器中。 API 一次接收 1 个图像和 1 个文本。它在单个呼叫或第一次呼叫时工作正常,但在一定数量的 API 呼叫后出现错误。
安装后Microsoft.Azure.DocumentDB
:
错误:
=== Pre-bind state information === LOG: DisplayName = Microsoft.Azure.Documents.Client, Version=1.11.0.0, Culture=neutral,
PublicKeyToken=31bf3856ad364e35 (Fully-specified) LOG: Appbase =
file:///D:/Project/002 MVC API/Cherish/API/Cherish.Api/ LOG: Initial
PrivatePath = D:\Project[=14=]2 MVC API\Cherish\API\Cherish.Api\bin
Calling assembly : Cherish.Domain, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null.
=== LOG: This bind starts in default load context. LOG: Using application configuration file: D:\Project[=14=]2 MVC
API\Cherish\API\Cherish.Api\web.config LOG: Using host configuration
file: C:\Users\Yudiz\Documents\IISExpress\config\aspnet.config LOG:
Using machine configuration file from
C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Microsoft.Azure.Documents.Client,
Version=1.11.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
LOG: Attempting download of new URL
file:///C:/Users/Yudiz/AppData/Local/Temp/Temporary ASP.NET
Files/vs/7b6de7f7/4f48effb/Microsoft.Azure.Documents.Client.DLL. LOG:
Attempting download of new URL
file:///C:/Users/Yudiz/AppData/Local/Temp/Temporary ASP.NET
Files/vs/7b6de7f7/4f48effb/Microsoft.Azure.Documents.Client/Microsoft.Azure.Documents.Client.DLL.
LOG: Attempting download of new URL file:///D:/Project/002 MVC
API/Cherish/API/Cherish.Api/bin/Microsoft.Azure.Documents.Client.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Major
Version ERR: Failed to complete setup of assembly (hr = 0x80131040).
Probing terminated.
这是我的代码片段:
var blobHelper = new BlobHelper();
var response = new UploadMediaResponse();
for (var i = 0; i<provider.Files.Count; i++)
{
Guid itemId;
var fileData = await provider.Files[i].ReadAsByteArrayAsync();
if (mediaType == MediaType.Thumbnail)
{
// MediaId is mandatory for Audio & Video media
if (String.IsNullOrWhiteSpace(provider.FormData["mediaId"]))
// ReSharper disable once NotResolvedInText
return ErrorResponse(new ArgumentNullException("mediaId", "MediaId was not provided"));
itemId = new Guid(provider.FormData["mediaId"]);
await blobHelper.Upload(mediaType, accountId, itemId, fileData, timelineEvent.ChildId);
var mediaItem = timelineEvent.Media.Single(m => m.Id == itemId);
mediaItem.HasThumbnail = true;
mediaItem.LastUpdated = DateTime.UtcNow;
await timelineEventRepository.UpdateAsync(timelineEvent, entityDoc.SelfLink);
}
else
{
itemId = await blobHelper.Upload(mediaType, accountId, fileData, timelineEvent.ChildId);
var mediaItem = new TimelineMediaItem
{
Id = itemId,
Available = true,
FileSize = fileData.Length,
Removed = false,
Type = mediaType.ToUpper(),
TaggedChildren = new List<TaggedChild>(),
Created = DateTime.UtcNow,
LastUpdated = DateTime.UtcNow
};
if (fileLengthsRequired)
mediaItem.Length = fileLengths[i];
timelineEvent.Media.Add(mediaItem);
await timelineEventRepository.UpdateAsync(timelineEvent, entityDoc.SelfLink);
}
response.MediaIds.Add(itemId);
}
DocumentClient 声明:
public DocumentRepository()
{
Client = new DocumentClient(new Uri(ConfigurationManager.AppSettings["DocumentDbEndpointUrl"]), ConfigurationManager.AppSettings["DocumentDbAuthKey"]);
DatabaseName = ConfigurationManager.AppSettings["DocumentDbDatabaseName"];
PageSize = Int16.Parse(ConfigurationManager.AppSettings["DefaultPageSize"]);
var _database = ReadOrCreateDatabase();
var collection = InitialiseCollection(_database.SelfLink, EntityName);
DocumentsLink = collection.DocumentsLink;
SelfLink = collection.SelfLink;
}
这是我的错误:
Error String :=> Optional({"Message":"An error has
occurred.","ExceptionMessage":"One or more errors
occurred.","ExceptionType":"System.AggregateException","StackTrace":"
at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean
includeTaskCanceledExceptions)\r\n at
System.Threading.Tasks.Task1.GetResultCore(Boolean
waitCompletionNotification)\r\n at
System.Threading.Tasks.Task1.get_Result()\r\n at
Microsoft.Azure.Documents.Linq.DocumentQuery1.GetEnumerator()\r\n
at System.Linq.Buffer1..ctor(IEnumerable1 source)\r\n at
System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source)\r\n at
Cherish.Domain.Repositories.Implementation.DocumentRepository1.ReadOrCreateDatabase()\r\n
at
Cherish.Domain.Repositories.Implementation.DocumentRepository1..ctor()\r\n
at Cherish.Api.Helpers.BlobHelper.AccountHasEnoughStorageCapacity(Guid
accountId, Int32 fileSize)\r\n at
Cherish.Api.Helpers.BlobHelper.d__4.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 Cherish.Api.Helpers.BlobHelper.d__3.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.ValidateEnd(Task task)\r\n
at Cherish.Api.Controllers.TimelineController.d__15.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
Cherish.Api.Controllers.TimelineController.d__11.MoveNext()","InnerException":{"Message":"An
error has occurred.","ExceptionMessage":"An error occurred while
sending the
request.","ExceptionType":"System.Net.Http.HttpRequestException","StackTrace":"
at
Microsoft.Azure.Documents.BackoffRetryUtility1.d__0.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.Azure.Documents.Linq.DocumentQueryExecutionContext.d__7.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.Azure.Documents.Linq.DocumentQuery1.d__10.MoveNext()","InnerException":{"Message":"An
error has occurred.","ExceptionMessage":"Unable to connect to the
remote
server","ExceptionType":"System.Net.WebException","StackTrace":" at
System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult
asyncResult, TransportContext& context)\r\n at
System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult
ar)","InnerException":{"Message":"An error has
occurred.","ExceptionMessage":"An attempt was made to access a socket
in a way forbidden by its access
permissions","ExceptionType":"System.Net.Sockets.SocketException","StackTrace":"
at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot,
SocketAddress socketAddress)\r\n at
System.Net.Sockets.Socket.InternalBind(EndPoint localEP)\r\n at
System.Net.Sockets.Socket.BeginConnectEx(EndPoint remoteEP, Boolean
flowContext, AsyncCallback callback, Object state)\r\n at
System.Net.Sockets.Socket.UnsafeBeginConnect(EndPoint remoteEP,
AsyncCallback callback, Object state)\r\n at
System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure,
Socket s4, Socket s6, Socket& socket, IPAddress& address,
ConnectSocketState state, IAsyncResult asyncResult, Exception&
exception)"}}}})
提前谢谢你。
根据您的问题,我认为在一定数量的 API 调用后,您的客户端和 documentdb 端点之间存在连接问题。您可以尝试创建 DocumentClient
的静态实例并将重试策略添加到您的 DocumentRepository
class 中,如下所示:
public class DocumentRepository
{
private static readonly DocumentClient _client;
static DocumentRepository()
{
var connectionPolicy = new ConnectionPolicy
{
RetryOptions = new RetryOptions()
{
MaxRetryAttemptsOnThrottledRequests = 5,
MaxRetryWaitTimeInSeconds = 5
}
};
_client = new DocumentClient(
new Uri(ConfigurationManager.AppSettings["DocumentDbEndpointUrl"]),
ConfigurationManager.AppSettings["DocumentDbAuthKey"],
connectionPolicy);
}
public DocumentRepository()
{
DatabaseName = ConfigurationManager.AppSettings["DocumentDbDatabaseName"];
PageSize = Int16.Parse(ConfigurationManager.AppSettings["DefaultPageSize"]);
var _database = ReadOrCreateDatabase();
var collection = InitialiseCollection(_database.SelfLink, EntityName);
DocumentsLink = collection.DocumentsLink;
SelfLink = collection.SelfLink;
}
public async Task UpdateAsync(TimelineEvent timelineEvent, string selfLink)
{
//TODO:
await _client.UpsertDocumentAsync("{documentCollectionUri}", timelineEvent);
}
}
另外官方有一篇blog讲Azure DocumentDB的性能技巧,大家可以参考一下
接受的答案实际上不是解决上述问题的方法。添加重试信息确实隐藏了一些症状,但它不会阻止它在未来再次发生。
如果 DocumentClient
没有正确定义为 A Singleton
那么应用程序可能会 运行 超出 TCP connections
并且那时候你会得到 socket error
.
请参考
this link on MSDN 了解更多信息。
谢谢,我希望这对其他人有帮助。
我创建了一个 API (MVC) 并将其托管在 Azure 服务器中。 API 一次接收 1 个图像和 1 个文本。它在单个呼叫或第一次呼叫时工作正常,但在一定数量的 API 呼叫后出现错误。
安装后Microsoft.Azure.DocumentDB
:
错误:
=== Pre-bind state information === LOG: DisplayName = Microsoft.Azure.Documents.Client, Version=1.11.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 (Fully-specified) LOG: Appbase = file:///D:/Project/002 MVC API/Cherish/API/Cherish.Api/ LOG: Initial PrivatePath = D:\Project[=14=]2 MVC API\Cherish\API\Cherish.Api\bin Calling assembly : Cherish.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null. === LOG: This bind starts in default load context. LOG: Using application configuration file: D:\Project[=14=]2 MVC API\Cherish\API\Cherish.Api\web.config LOG: Using host configuration file: C:\Users\Yudiz\Documents\IISExpress\config\aspnet.config LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config. LOG: Post-policy reference: Microsoft.Azure.Documents.Client, Version=1.11.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 LOG: Attempting download of new URL file:///C:/Users/Yudiz/AppData/Local/Temp/Temporary ASP.NET Files/vs/7b6de7f7/4f48effb/Microsoft.Azure.Documents.Client.DLL. LOG: Attempting download of new URL file:///C:/Users/Yudiz/AppData/Local/Temp/Temporary ASP.NET Files/vs/7b6de7f7/4f48effb/Microsoft.Azure.Documents.Client/Microsoft.Azure.Documents.Client.DLL. LOG: Attempting download of new URL file:///D:/Project/002 MVC API/Cherish/API/Cherish.Api/bin/Microsoft.Azure.Documents.Client.DLL. WRN: Comparing the assembly name resulted in the mismatch: Major Version ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
这是我的代码片段:
var blobHelper = new BlobHelper();
var response = new UploadMediaResponse();
for (var i = 0; i<provider.Files.Count; i++)
{
Guid itemId;
var fileData = await provider.Files[i].ReadAsByteArrayAsync();
if (mediaType == MediaType.Thumbnail)
{
// MediaId is mandatory for Audio & Video media
if (String.IsNullOrWhiteSpace(provider.FormData["mediaId"]))
// ReSharper disable once NotResolvedInText
return ErrorResponse(new ArgumentNullException("mediaId", "MediaId was not provided"));
itemId = new Guid(provider.FormData["mediaId"]);
await blobHelper.Upload(mediaType, accountId, itemId, fileData, timelineEvent.ChildId);
var mediaItem = timelineEvent.Media.Single(m => m.Id == itemId);
mediaItem.HasThumbnail = true;
mediaItem.LastUpdated = DateTime.UtcNow;
await timelineEventRepository.UpdateAsync(timelineEvent, entityDoc.SelfLink);
}
else
{
itemId = await blobHelper.Upload(mediaType, accountId, fileData, timelineEvent.ChildId);
var mediaItem = new TimelineMediaItem
{
Id = itemId,
Available = true,
FileSize = fileData.Length,
Removed = false,
Type = mediaType.ToUpper(),
TaggedChildren = new List<TaggedChild>(),
Created = DateTime.UtcNow,
LastUpdated = DateTime.UtcNow
};
if (fileLengthsRequired)
mediaItem.Length = fileLengths[i];
timelineEvent.Media.Add(mediaItem);
await timelineEventRepository.UpdateAsync(timelineEvent, entityDoc.SelfLink);
}
response.MediaIds.Add(itemId);
}
DocumentClient 声明:
public DocumentRepository()
{
Client = new DocumentClient(new Uri(ConfigurationManager.AppSettings["DocumentDbEndpointUrl"]), ConfigurationManager.AppSettings["DocumentDbAuthKey"]);
DatabaseName = ConfigurationManager.AppSettings["DocumentDbDatabaseName"];
PageSize = Int16.Parse(ConfigurationManager.AppSettings["DefaultPageSize"]);
var _database = ReadOrCreateDatabase();
var collection = InitialiseCollection(_database.SelfLink, EntityName);
DocumentsLink = collection.DocumentsLink;
SelfLink = collection.SelfLink;
}
这是我的错误:
Error String :=> Optional({"Message":"An error has occurred.","ExceptionMessage":"One or more errors occurred.","ExceptionType":"System.AggregateException","StackTrace":" at System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)\r\n at System.Threading.Tasks.Task1.GetResultCore(Boolean
waitCompletionNotification)\r\n at
System.Threading.Tasks.Task1.get_Result()\r\n at Microsoft.Azure.Documents.Linq.DocumentQuery1.GetEnumerator()\r\nat System.Linq.Buffer1..ctor(IEnumerable1 source)\r\n at
System.Linq.Enumerable.ToArray[TSource](IEnumerable1 source)\r\n at Cherish.Domain.Repositories.Implementation.DocumentRepository1.ReadOrCreateDatabase()\r\n at
Cherish.Domain.Repositories.Implementation.DocumentRepository1..ctor()\r\n at Cherish.Api.Helpers.BlobHelper.AccountHasEnoughStorageCapacity(Guid accountId, Int32 fileSize)\r\n at Cherish.Api.Helpers.BlobHelper.d__4.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 Cherish.Api.Helpers.BlobHelper.d__3.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.ValidateEnd(Task task)\r\n at Cherish.Api.Controllers.TimelineController.d__15.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 Cherish.Api.Controllers.TimelineController.d__11.MoveNext()","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"An error occurred while sending the request.","ExceptionType":"System.Net.Http.HttpRequestException","StackTrace":" at Microsoft.Azure.Documents.BackoffRetryUtility1.d__0.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.Azure.Documents.Linq.DocumentQueryExecutionContext.d__7.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.Azure.Documents.Linq.DocumentQuery1.d__10.MoveNext()","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"Unable to connect to the remote server","ExceptionType":"System.Net.WebException","StackTrace":" at System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context)\r\n at System.Net.Http.HttpClientHandler.GetRequestStreamCallback(IAsyncResult ar)","InnerException":{"Message":"An error has occurred.","ExceptionMessage":"An attempt was made to access a socket in a way forbidden by its access permissions","ExceptionType":"System.Net.Sockets.SocketException","StackTrace":" at System.Net.Sockets.Socket.DoBind(EndPoint endPointSnapshot, SocketAddress socketAddress)\r\n at System.Net.Sockets.Socket.InternalBind(EndPoint localEP)\r\n at System.Net.Sockets.Socket.BeginConnectEx(EndPoint remoteEP, Boolean flowContext, AsyncCallback callback, Object state)\r\n at System.Net.Sockets.Socket.UnsafeBeginConnect(EndPoint remoteEP, AsyncCallback callback, Object state)\r\n at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception)"}}}})
提前谢谢你。
根据您的问题,我认为在一定数量的 API 调用后,您的客户端和 documentdb 端点之间存在连接问题。您可以尝试创建 DocumentClient
的静态实例并将重试策略添加到您的 DocumentRepository
class 中,如下所示:
public class DocumentRepository
{
private static readonly DocumentClient _client;
static DocumentRepository()
{
var connectionPolicy = new ConnectionPolicy
{
RetryOptions = new RetryOptions()
{
MaxRetryAttemptsOnThrottledRequests = 5,
MaxRetryWaitTimeInSeconds = 5
}
};
_client = new DocumentClient(
new Uri(ConfigurationManager.AppSettings["DocumentDbEndpointUrl"]),
ConfigurationManager.AppSettings["DocumentDbAuthKey"],
connectionPolicy);
}
public DocumentRepository()
{
DatabaseName = ConfigurationManager.AppSettings["DocumentDbDatabaseName"];
PageSize = Int16.Parse(ConfigurationManager.AppSettings["DefaultPageSize"]);
var _database = ReadOrCreateDatabase();
var collection = InitialiseCollection(_database.SelfLink, EntityName);
DocumentsLink = collection.DocumentsLink;
SelfLink = collection.SelfLink;
}
public async Task UpdateAsync(TimelineEvent timelineEvent, string selfLink)
{
//TODO:
await _client.UpsertDocumentAsync("{documentCollectionUri}", timelineEvent);
}
}
另外官方有一篇blog讲Azure DocumentDB的性能技巧,大家可以参考一下
接受的答案实际上不是解决上述问题的方法。添加重试信息确实隐藏了一些症状,但它不会阻止它在未来再次发生。
如果 DocumentClient
没有正确定义为 A Singleton
那么应用程序可能会 运行 超出 TCP connections
并且那时候你会得到 socket error
.
请参考 this link on MSDN 了解更多信息。
谢谢,我希望这对其他人有帮助。