c# - 一定数量的API调用后Azure服务器抛出异常

标签 c# linq sockets azure-storage-blobs azure-cosmosdb

我创建了一个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\002 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\002 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类中,如下所示:

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的性能提示,您可以引用它。

关于c# - 一定数量的API调用后Azure服务器抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42641082/

相关文章:

c# - 如何知道是否有一轮是由 parent 引起的(A=>B=>C=>A)

linq - 在 LINQ 中提交更改之前引用对象的标识

java - Kademlia Java 实现

c# - static int Main返回值给谁?

c# - Datatrigger 绑定(bind)到 ControlTemplate 和 ContentPresenter 中样式 TargetType 的属性

c# - 双缓冲图形的 AccessViolationException

linux - 有没有办法在数据包通过套接字到达时收到通知,而不是使用 recv() 继续轮询

c# - C# 中私有(private)构造函数的需求是什么?

c# - GroupBy 然后对每个组的结果进行聚合

python - Python网络套接字-[WinError 10053]