Сервер Azure генерирует исключение после определенного количества вызовов API

Я создал API (MVC) и разместил его на сервере Azure. API получает 1 изображение и 1 текст за раз. Он работает правильно для одного вызова или первого вызова, но после определенного количества вызовов API появляется ошибка ниже.

После установки Microsoft.Azure.DocumentDB:

Ошибка:

=== Информация о состоянии предварительной привязки === LOG: DisplayName = Microsoft.Azure.Documents.Client, Version = 1.11.0.0, Culture = нейтральный, PublicKeyToken = 31bf3856ad364e35 (полностью заданный) 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 Сборка вызова: Cherish.Domain, версия = 1.0 .0.0, Культура = нейтральный, PublicKeyToken = null. === LOG: Эта привязка запускается в контексте загрузки по умолчанию. ЖУРНАЛ: Использование файла конфигурации приложения: D: \ Project \ 002 MVC API \ Cherish \ API \ Cherish.Api \ web.config ЖУРНАЛ: Использование файла конфигурации хоста: C: \ Users \ Yudiz \ Documents \ IISExpress \ config \ aspnet.config ЖУРНАЛ: использование файла конфигурации компьютера из C: \ Windows \ Microsoft.NET \ Framework \ v4.0.30319 \ config \ machine.config. ЖУРНАЛ: Ссылка после политики: Microsoft.Azure.Documents.Client, Версия = 1.11.0.0, Культура = нейтральная, PublicKeyToken = 31bf3856ad364e35 ЖУРНАЛ: Попытка загрузки нового файла URL: /// C: / Users / Yudiz / AppData / Local / Temp / Временные файлы ASP.NET / vs / 7b6de7f7 / 4f48effb / Microsoft.Azure.Documents.Client.DLL. ЖУРНАЛ: попытка загрузки нового файла URL: /// C: / Users / Yudiz / AppData / Local / Temp / Temporary ASP.NET Files / vs / 7b6de7f7 / 4f48effb / Microsoft.Azure.Documents.Client / Microsoft.Azure.Documents .Client.DLL. ЖУРНАЛ: попытка загрузки нового файла URL: /// D: / Project / 002 MVC API / Cherish / API / Cherish.Api / bin / Microsoft.Azure.Documents.Client.DLL. WRN: сравнение имени сборки привело к несоответствию: Основная версия ERR: Не удалось завершить настройку сборки (hr = 0x80131040). Зондирование прекращено.

Вот мой фрагмент кода:

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

Вот моя ошибка:

Строка ошибки: => Необязательно ({"Сообщение": "Произошла ошибка.", "ExceptionMessage": "Произошла одна или несколько ошибок.", "ExceptionType": "System.AggregateException", "StackTrace": "в системе .Threading.Tasks.Task.ThrowIfExceptional (Boolean includeTaskCanceledExceptions) \ r \ n в System.Threading.Tasks.Task1.GetResultCore (Boolean
waitCompletionNotification) \ r \ n в
System.Threading.Tasks.Task1.get_Result () \ r \ n в Microsoft.Azure.Documents.Linq.DocumentQuery1.GetEnumerator () \ r \ n

Заранее спасибо.

В соответствии с вашей проблемой я предположил, что между вашим клиентом и конечной точкой documentdb возникнут проблемы с подключением после определенного количества вызовов API. Вы можете попытаться создать статический экземпляр Microsoft.Azure.DocumentDB и добавить политику повтора в свой

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);
}
класс следующим образом:


person Chandresh Khambhayata    schedule 07.03.2017    source источник
comment
@ Bruce-MSFT Да, я использую DocumentDB и обновил вопрос кодом.   -  person Bruce Chen    schedule 08.03.2017
comment
@ Bruce-MSFT: у вас была возможность задать вопрос, пожалуйста?   -  person Chandresh Khambhayata    schedule 08.03.2017
comment
Из трассировки стека я заметил, что ошибка была выброшена на _1_. Исходя из вашего кода, что представляет собой переменная _2_, класс _3_ или что-то еще? Вы пытались реализовать синглтон (например, создать статический экземпляр DocumentClient и повторно использовать этот статический экземпляр) для _4_ в классе _5_?   -  person Chandresh Khambhayata    schedule 10.03.2017
comment
DocumentRepository.ReadOrCreateDatabase() - это timelineEventRepository. DocumentRepository вы имеете в виду, что я должен определить DocumentClient вне DocumentRepository как _6_? Пожалуйста, поправьте меня, если я ошибаюсь.   -  person Bruce Chen    schedule 10.03.2017
comment
Я получаю сообщение об ошибке при использовании timelineEventRepository: DocumentRepository   -  person Chandresh Khambhayata    schedule 10.03.2017


Ответы (2)


Кроме того, существует официальный блог, в котором рассказывается о советах по производительности для Azure DocumentDB, вы можете обратиться к нему.

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

Принятый ответ на самом деле не является решением проблемы, указанной выше. Добавление информации о повторных попытках скрывает некоторые симптомы, но не предотвращает их повторение в будущем.

person Bruce Chen    schedule 13.03.2017
comment
Я использовал клиентскую библиотеку Microsoft Azure DocumentDB 1.11.1 в своей разработке, вы могли попробуйте проверить версию вашей клиентской библиотеки. Если возникнут какие-либо проблемы, дайте мне знать. - person Chandresh Khambhayata; 14.03.2017
comment
Я использую _1_ - person Bruce Chen; 14.03.2017
comment
Я добавил Microsoft.Azure.Documents.Client, и ошибка исчезла. сейчас я проверяю реальную проблему. - person Chandresh Khambhayata; 14.03.2017
comment
Должен ли я утилизировать Microsoft.Azure.DocumentDB? - person Chandresh Khambhayata; 14.03.2017
comment
Рекомендуется использовать один экземпляр DocumentClient для каждого домена приложения на протяжении всего срока службы вашего приложения. Вы можете сначала проверить, можно ли решить эту проблему. - person Chandresh Khambhayata; 14.03.2017
comment
Я предположил, что, поскольку вы обновили версию DocumentClient, моя старая версия находится в ссылках на другие ваши проекты. Вы можете обратиться к этой аналогичной проблеме. - person Bruce Chen; 14.03.2017
comment
Давайте продолжим это обсуждение в чате. - person Bruce Chen; 14.03.2017
comment
Это должен быть комментарий. - person Chandresh Khambhayata; 14.03.2017

Если DocumentClient не определен должным образом как A Singleton, то, возможно, приложение исчерпает TCP connections, и тогда вы получите socket error.

См. эта ссылка на MSDN для получения дополнительной информации.

Спасибо, и я надеюсь, что это поможет другим.

Вы используете Azure DocumentDB? Я обнаружил проблему с аналогичной ошибкой, вы можете обратиться к it. Не могли бы вы предоставить нам фрагмент основного кода, чтобы мы обнаружили эту проблему?

person Kenneth Garza    schedule 23.04.2018
comment
в System.Linq.Buffer1..ctor (источник IEnumerable1) \ r \ n в
System.Linq.Enumerable.ToArray [TSource] (источник IEnumerable1) \ r \ n в Cherish.Domain.Repositories.Implementation.DocumentRepository1. ReadOrCreateDatabase () \ r \ n в
Cherish.Domain.Repositories.Implementation.DocumentRepository1..ctor () \ r \ n в Cherish.Api.Helpers.BlobHelper.AccountHasEnoughStorageCapacity (Guid accountId, Int32 fileSize) \ r \ n в Cherish.Api.Helpers.BlobHelper.d__4.MoveNext () \ r \ n --- Конец трассировки стека из предыдущего места, где было сгенерировано исключение --- \ r \ n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess ( Task task) \ r \ n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task task) \ r \ n в Cherish.Api.Helpers.BlobHelper.d__3.MoveNext () \ r \ n --- Конец трассировки стека из предыдущего места, где было сгенерировано исключение --- \ r \ n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) \ r \ n в System.Runtime.CompilerServi ces.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) \ r \ n в System.Runtime.CompilerServices.TaskAwaiter.ValidateEnd (задача задачи) \ r \ n в Cherish.Api.Controllers.TimelineController.d__15.MoveNext- () - Конец трассировки стека из предыдущего места, где было сгенерировано исключение --- \ r \ n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task task) \ r \ n в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Task task) \ r \ n в Cherish.Api.Controllers.TimelineController.d__11.MoveNext () »,« InnerException »: {« Сообщение »:« Произошла ошибка. »,« ExceptionMessage »:« Произошла ошибка при отправке request. "," ExceptionType ":" System.Net.Http.HttpRequestException "," StackTrace ":" в Microsoft.Azure.Documents.BackoffRetryUtility1.d__0.MoveNext () \ r \ n --- Конец трассировки стека из предыдущего место, где было сгенерировано исключение
--- \ r \ n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Задача
задача) \ r \ n в
System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) \ r \ n в
Microsoft.Azure.Documents.Linq.DocumentQueryExecutionContext.d__7.MoveNext () \ r \ n --- End трассировки стека из предыдущего места, где было сгенерировано исключение
--- \ r \ n в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (Task
task) \ r \ n в
System.Runtime.CompilerServices .TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача задачи) \ r \ n в
Microsoft. Azure.Documents.Linq.DocumentQuery1.d__10.MoveNext () "," InnerException ": {" Сообщение ":" Произошла ошибка. "," ExceptionMessage ":" Невозможно подключиться к удаленному серверу "," ExceptionType ": «System.Net.WebException», «StackTrace»: «в System.Net.HttpWebRequest.EndGetRequestStream (IAsyncResult asyncResult, TransportContext & context) \ r \ n в System.Net.Http.HttpClientHandler.GetRequestStreamCallbackes (IAsyncResult asyncResult), ": {" Сообщение ":" Произошла ошибка. "," ExceptionMessage ":" Была сделана попытка получить доступ к сокету способом, запрещенным его разрешениями на доступ "," ExceptionType ":" System.Net.Sockets.SocketException "," StackTrace ":" в System.Net.Sockets.Socket.DoBind (EndPoint endPointSnapshot, SocketAddress socketAddress) \ r \ n в System.Net.Sockets.Socket.InternalBind (EndPoint localEP) \ r \ n в System.Net .Sockets.Socket.BeginConnectEx (EndPoint remoteEP, логический flowContext, обратный вызов AsyncCallback, состояние объекта) \ r \ n в System.Net.Sockets.Socket.UnsafeBeginConnec t (EndPoint remoteEP, обратный вызов AsyncCallback, состояние объекта) \ r \ n в System.Net.ServicePoint.ConnectSocketInternal (Boolean connectFailure, Socket s4, Socket s6, Socket & socket, IPAddress & address, ConnectSocketState state, IAsyncResult "asyncResult), исключение и исключение }}}) - person bfontaine; 23.04.2018