Post a reply

Options
Add an Attachment

If you do not want to add an Attachment to your Post, please leave the Fields blank.

(maximum 10 MB; please compress large files; only common media, archive, text and programming file formats are allowed)

Options

Topic review

dlambert

Workaround

My entire flow does a bunch of work in addition to the FTP I described above. Originally, I'd returned the FTP results to an orchestrator that determines whether each step in the process worked. That orchestrator also handled writing the report to JSON, since it knows about config options for verbosity, logging folders, and so on.

My workaround is to have the routine above also handle writing the JSON output. Not as clean for reasons above, but it seems to be working.
martin

Re: I've got a workaround

Sorry, I do not understand. Can you share details of your workaround?
dlambert

I've got a workaround

FYI – I moved the serialization of FTP results inside the Session using {} block – this seems to be an ok workaround for me right now. I think this is still a minor gotcha, but I'm not in dire need of a fix right now.
dlambert

Consider an attribute to exclude from serialization?

Thanks for your help, Martin. I don't believe I can exclude that property with a broad brush – many of the properties I want are readonly, so I can use a serialization option like IgnoreReadOnlyProperties = true, for instance, per these guidelines:
https://learn.microsoft.com/en-us/dotnet/standard/serialization/system-text-json/ignore-properties

Would you consider adding a JSON serialization decoration like [JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingDefault)] to the WinSCP.SessionException.Session property?
martin

Re: TransferOperationResult disposed before I can serialize it.

I believe that the only disposable element of TransferOperationResult is the reference to the Session itself in TransferOperationResult.Failures[...].Session. So if you are serializing whole TransferOperationResult object, your code will fail whenever there's any "failure". Skip the Session object when serializing the results.
dlambert

TransferOperationResult disposed before I can serialize it.

I have a method that performs an FTP put and returns results to the caller in the form of a TransferOperationResult object. The intent is to write these results as a JSON doc and use success & failure counts to evaluate overall success.

The method doing the put is pretty straightforward:
TransferOperationResult? result = null;
try
{
    SessionOptions sessionOptions = new SessionOptions
    {
        ...
    };
 
    using (Session session = new Session())
    {
        // Connect
        session.Open(sessionOptions);
 
        // Upload files
        TransferOptions transferOptions = new TransferOptions();
        transferOptions.TransferMode = TransferMode.Binary;
        transferOptions.OverwriteMode = OverwriteMode.Overwrite;
        transferOptions.ResumeSupport.State = TransferResumeSupportState.Off;
 
        result = session.PutFiles(fromPath, toPath, false, transferOptions);
    }
}
catch (Exception ex)
{
    _logger.LogError("Exception in ftp CopyToDestination: {0}", ex.ToString());
}
return result;

In the calling routine, I'm serializing result to JSON. Most of the time, this works great, but every once in a while, I see "System.InvalidOperationException: Object is disposed" when writing result to JSON.

With result declared outside the using block, I didn't think result was going to be disposed, but it seems to be doing just that. Does anyone see anything *obvious* I'm doing wrong?