У нас есть три почтовых сервера с работающими на них почтовыми приложениями PHP. У нас есть работа .NET, работающая на отдельном сервере, который загружает фотографии контактов из facebook, сохраняет их во временном местоположении на NAS, а затем вызывает приложение PHP mail, чтобы сообщить ему, чтобы переместить изображение из временного местоположения в запись контакта.
Это задание, без изменений кода, отлично работало, у нас был только один почтовый сервер, причем временные файлы хранятся локально на нем. Теперь, когда мы перешли к конфигурации с балансировкой нагрузки, с временными файлами в ящике NAS, возникают более сложные проблемы времени.
В нашем приложении .NET после загрузки фотографии перед отправкой запроса в наше почтовое приложение мы получаем объект FileInfo
и проверяем, существует ли файл, чтобы быть уверенным. Затем мы отправляем запрос на PHP, который теперь прерывается: failed to open stream: No such file or directory
Однако, если после проверки fi.Exists
в .NET перед отправкой запроса на PHP мы помещаем Thread.Sleep(n)
ошибки уменьшаются. Чем дольше сон, тем реже PHP говорит, что файл не существует.
Таким образом, файл существует, но по какой-то причине, если мы попытаемся получить к нему доступ слишком скоро после загрузки, PHP считает, что он не существует.
Код включает проверки, чтобы убедиться, что файл полностью загружен и не помечен как доступный только для чтения.
Любые идеи, что может вызвать эту проблему?
public void Save(string tempPath, string username, string password, bool deleteSrc, string merakController = "", string fileNamePrefix = "") { FileInfo fi = new FileInfo(tempPath); if (fi.Exists) { Name = (fileNamePrefix ?? string.Empty) + fi.Name; FileSize = fi.Length; TimeStamp = fi.LastWriteTimeUtc; string path = fi.FullName; if (string.IsNullOrEmpty(Type)) throw new Exception("Attachment Type not set"); IceWarpGroupware_Http gwh = new IceWarpGroupware_Http(username, password); string parameters = string.Format("AttName={0}&AttType={1}&AttDesc={0}&AttSize={2}&AttTime={3}", Name, Type, FileSize, Time); fi.Refresh(); if (fi.Length != FileSize) throw new Exception("It was still downloading?");//this has never been thrown, so thats not it if (fi.IsReadOnly) throw new Exception("read only"); //again, never hit, so thats not it //adding this line makes it work 100% of the time -- reducing the sleep time makes it start to throw "failed to open stream: No such file or directory" intermittently System.Threading.Thread.Sleep(15000); bool result = gwh.AddAttachment(m_oid, path, parameters, string.Empty, merakController); if (!result) throw new Exception("Unable to add attachment \"" + Name + "\""); try { if (deleteSrc) fi.Delete(); } catch { } } //else // throw new Exception("Temp file not found"); }