2016-09-08 3 views
1

Je dois transférer des fichiers volumineux via SFTP à partir d'un site Web. Je ne peux pas stocker ces fichiers (même temporairement) sur le serveur Web, donc je suis en train de diffuser le fichier en morceaux sur le serveur SFTP.Erreur "Message incorrect" lors de l'accès à un fichier sur le serveur Windows OpenSSH SFTP

J'ai installé OpenSSH (version 5_30_2016) sur une autre machine Windows et j'essaie de me connecter à l'aide de SSH.NET (version 2016.0.0).

Ce code exemple donne provoque une exception à jeter sur ma machine:

const string PATH = "/D:/sftp/test.xml"; 
var Client = new SftpClient("host", 22, "username", "password"); 

Client.Connect(); 

if(!Client.Exists(PATH)) 
{      
    var s = Client.Create(PATH, 1024 * 4); 
    s.Dispose();   
} 

var Data = File.ReadAllBytes(@"D:\Temp\TestFile.xml"); 
using(var w = Client.Open(PATH, FileMode.Append, FileAccess.ReadWrite)) // this line throws an exception 
{ 
    w.Write(Data, 0, Data.Length); 
} 

Client.Disconnect(); 

Je reçois une exception SSH à venir chaque fois que je tente de me connecter mon client pour ajouter ou ouvrir - essentiellement toute opération qui retourne une Stream ou StreamWriter.

L'erreur que je reçois à travers le client SFTP est "Bad Message" qui n'est pas très descriptif. J'espère juste avoir manqué quelque chose d'évident dans mon approche ...!

J'ai également essayé d'utiliser d'autres bibliothèques SFTP, mais elles semblent toutes dépendre de la transmission d'un fichier local physique à l'emplacement distant, ce qui n'est pas ce que je veux faire. Il semble que SSH.NET est le mieux adapté à mes besoins car il fournit des méthodes pour les tableaux d'octets de passage et les flux vers le serveur SFTP

trace de la pile, avec le message « mauvais message »:

at Renci.SshNet.Sftp.SftpSession.RequestOpen(String path, Flags flags, Boolean nullOnError) 
    at Renci.SshNet.Sftp.SftpFileStream..ctor(ISftpSession session, String path, FileMode mode, FileAccess access, Int32 bufferSize, Boolean useAsync) 
    at Renci.SshNet.Sftp.SftpFileStream..ctor(ISftpSession session, String path, FileMode mode, FileAccess access, Int32 bufferSize) 
    at Renci.SshNet.SftpClient.Open(String path, FileMode mode, FileAccess access) 
+0

Quelle version de SSH.NET et OpenSSH utilisez-vous? –

+0

Obtenez-vous les mêmes résultats avec une application console normale? C'est à dire. pas de code asynchrone. Vous devriez créer [mcve] avant de poster une question. –

+0

Hey @MartinPrikryl J'ai mis à jour ma question avec un extrait de code plus simple. En répondant à votre question, WebApi, l'analyseur de requêtes et les données asynchrones sont exclus. – Braydie

Répondre

1

C'est le mode FileMode.Append.

Il semble que le serveur Windows OpenSSH ne le supporte pas. Si vous le remplacez par FileMode.Create, cela fonctionne.


Au lieu de FileMode.Append, vous pouvez utiliser l'argument offset du SftpFileStream.Write.

+0

La suppression de la barre oblique donne malheureusement le même résultat. En outre, les autres commandes qui utilisent le chemin avec barre oblique (comme la création de répertoires et de fichiers vides) semblent fonctionner indépendamment de la barre oblique – Braydie

+0

Eh bien, fonctionne pour moi. Et même pour moi, le 'Client.Create' échoue avec la barre oblique. –

+0

De toute façon, pouvez-vous télécharger le fichier en utilisant un client SFTP en ligne de commande, comme avec WinSCP: 'winscp.com/commande" upload sftp: // nom d'utilisateur @ mot de passe @ hôte/"" put D: \ Temp \ TestFile.xml D : /sftp/test.xml "" exit "' + Pouvez-vous même naviguer jusqu'à 'D:/sftp' dans l'interface graphique WinSCP? –