C3 - S3 PutObjectRequest истекает (как и ожидалось) в Windows, но не в Raspbian - PullRequest
0 голосов
/ 28 сентября 2018

Недавно я опубликовал вопрос о приложении с таймером ( C # FileStream в Mono - нарушение обмена файлами ).

При событии таймера он проверяет файлы в папке и пытается загрузить их в корзину S3.Когда я не был подключен к Интернету (для проверки работоспособности в автономном режиме), я получал исключения из-за нарушения прав доступа, поскольку мой интервал таймера был меньше, чем время ожидания для S3 PutObjectRequest.Поэтому второе событие таймера не может получить доступ к файлу, поскольку оно все еще задерживается первым PutObjectRequest, время которого еще не истекло.Я решил эту проблему, увеличив интервал таймера после таймаута PutObjectRequest.

Когда я запускаю одно и то же приложение на Raspbian (с Mono), без интернета, PutObjectRequest никогда не прерывается или не возвращается.Таким образом, я снова получаю исходное нарушение прав доступа.Код ниже показывает метод, который делает запрос Put.Как вы можете видеть, я также попытался сократить время ожидания до 10 секунд и только одну попытку.Без разницы.

static async Task<bool> WritingCSVFileToS3Async(FileInfo file)
    {
        try
        {
            ErrorLogging.LogMessageToFile("Trying to write csv file to S3.");
           // using (client = new AmazonS3Client(bucketRegion))
            //using (client = new AmazonS3Client(new AmazonS3Config { Timeout = TimeSpan.FromSeconds(10), MaxErrorRetry = 1, RegionEndpoint = bucketRegion, ThrottleRetries = false }))
            {

                    // Put the object-set ContentType and add metadata.
                var putRequest = new PutObjectRequest
                {
                    BucketName = bucketName,
                    Key = file.Name,
                    FilePath = file.FullName,
                    ContentType = "text/csv"
                };
                //putRequest.Metadata.Add("x-amz-meta-title", "someTitle"); //don't need meta data at this time


                PutObjectResponse response = await client.PutObjectAsync(putRequest);

                if (response.HttpStatusCode == System.Net.HttpStatusCode.OK)
                {
                    ErrorLogging.LogMessageToFile("Http response code OK.");
                    return true;
                }

                else
                {
                    ErrorLogging.LogMessageToFile(response.HttpStatusCode.ToString());
                    return false;
                }
            }
        }
        catch (AmazonS3Exception e)
        {
            ErrorLogging.LogErrorToFile(e);
            return false;
        }
        catch (Exception e)
        {
            ErrorLogging.LogErrorToFile(e);
            return false;
        }
    }

В Windows я получаю следующее исключение тайм-аута, как и ожидалось.Тем не менее, я не получаю ничего этого на Raspbian, даже если я жду 5 минут.Мой журнал только показывает, что я делаю это в «Попытка записи CSV-файла на S3».линия.Ничего больше.Например, если он никогда не выдает исключение или ничего не возвращает.

***Error message: ***A WebException with status NameResolutionFailure was thrown.
***HResult: ***-2146233088
***Inner exception: ***System.Net.WebException: The remote name could not be resolved: 's3.ca-central-1.amazonaws.com'
   at System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult, TransportContext& context)
   at System.Net.HttpWebRequest.EndGetRequestStream(IAsyncResult asyncResult)
   at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization)

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 01 ноября 2018

Мне удалось решить эту проблему путем обновления до моно 5.14 (не 5.16), которое имеет важные обновления для WinForms.Не уверен, что именно решило основную проблему, но теперь она работает как ожидалось и истекло время ожидания.

...