/// <summary> /// Gets an asset file in the form of an array of bytes /// </summary> /// <param name="assetFileParameterMessage">Message wrapper for GetAssetFile parameters</param> /// <returns>a StreamErrorWrapper with the relevant stream or with a code that specifies that the file is the same as the one on the client side or with error information</returns> public StreamErrorWrapper GetAssetFile(AssetFileParameterMessage assetFileParameterMessage) { StreamErrorWrapper streamErrorWrapper = new StreamErrorWrapper(); // close returned stream on completion OperationContext clientContext = OperationContext.Current; clientContext.OperationCompleted += new EventHandler(delegate(object sender, EventArgs args) { if (streamErrorWrapper.ReturnStream != null) { streamErrorWrapper.ReturnStream.Dispose(); } }); if (assetFileParameterMessage.SystemPassPhrase != _systemPassPhrase) { streamErrorWrapper.ErrorCode = "ERR:001"; streamErrorWrapper.Message = "Authentication failure"; streamErrorWrapper.ErrorSeverity = ErrorSeverity.Retriable; streamErrorWrapper.ErrorStatus = ErrorStatus.Failure; streamErrorWrapper.ReturnStream = new MemoryStream(new byte[0]); return(streamErrorWrapper); } // _assetPath/<asset's GUID suffix>/asset filename string assetFullPath = FileRepositoryHelper.GetAssetFullPath(assetFileParameterMessage.AssetFileName); if (!File.Exists(assetFullPath)) { _applicationLog.Warn(assetFullPath + " does not exist."); streamErrorWrapper.ErrorCode = "ERR:002"; streamErrorWrapper.Message = "File not found"; streamErrorWrapper.ErrorSeverity = ErrorSeverity.Retriable; // search for asset file later streamErrorWrapper.ErrorStatus = ErrorStatus.Failure; streamErrorWrapper.ReturnStream = new MemoryStream(new byte[0]); return(streamErrorWrapper); } string serverSideChecksum = ReadStringFromFile(Path.GetDirectoryName(assetFullPath) + "\\" + Path.GetFileNameWithoutExtension(assetFullPath) + ".chk"); if (assetFileParameterMessage.Checksum == serverSideChecksum) { streamErrorWrapper.ErrorStatus = ErrorStatus.ChecksumEqual; streamErrorWrapper.ReturnStream = new MemoryStream(new byte[0]); return(streamErrorWrapper); } TryReadFileWithReadLock(streamErrorWrapper, assetFullPath); return(streamErrorWrapper); }