Multipart formes de C# client
Je suis en train de remplir un formulaire dans une application en php à partir d'un client C# (addin Outlook). J'ai utilisé un violon pour voir l'original de la demande à partir de l'intérieur de l'application en php et que le formulaire est transmis sous forme d'un multipart/form. Malheureusement .Net ne proviennent pas avec la prise en charge native pour ce type de formes (client web n'a qu'une méthode pour le téléchargement d'un fichier).
Quelqu'un sait d'une bibliothèque ou un a un code pour y parvenir? Je veux mettre des valeurs différentes et en plus (mais parfois seulement) un fichier.
Merci pour votre aide,
Sebastian
- Cela fonctionne comme un charme www.briangrinstead.com/blog
- Si vous n'avez pas l'esprit d'une petite bibliothèque de dépendance, Flurl en fait ce sujet aussi simple que cela. [Disclaimer: je suis l'auteur]
Vous devez vous connecter pour publier un commentaire.
C'est coupé et collé à partir d'un exemple de code que j'ai écrit, j'espère que ça doit donner les bases. Il prend en charge uniquement les Fichiers de données et de données de formulaire à l'heure actuelle.
Pour envoyer les données, vous devez ensuite:
Espère que c'est clair, j'ai coupé et collé à partir de quelques sources pour obtenir que plus propre.
Merci pour les réponses, tout le monde! J'ai récemment eu à obtenir que cela fonctionne, et utilisé vos suggestions fortement. Cependant, il y avait un couple de parties difficiles qui n'a pas fonctionné comme prévu, la plupart ayant à voir avec la réalité, y compris le fichier (qui était une partie importante de la question). Il y a beaucoup de réponses ici déjà, mais je pense que cela peut être utile à quelqu'un dans le futur (je ne pouvais pas trouver de nombreux exemples de cette ligne). Je a écrit un post de blog qui explique un peu plus.
En gros, j'ai d'abord essayé de passer dans le fichier de données encodées UTF8, mais j'ai eu des problèmes avec l'encodage des fichiers (il a bien fonctionné pour un fichier de texte brut, mais lors du téléchargement d'un Document Word, par exemple, si j'ai essayé d'enregistrer le fichier a été transmis par la forme validée à l'aide de la Demande.Files[0].SaveAs(), ouvrir le fichier dans Word ne fonctionne pas correctement. J'ai trouvé que si vous écrivez le fichier de données directement à l'aide d'un Flux de données (plutôt que d'un StringBuilder), il a fonctionné comme prévu. Aussi, j'ai fait quelques modifications qu'il est plus facile pour moi de comprendre.
Par le chemin, la Multipart les Formulaires de Demande de Commentaires et la Recommandation du W3C pour mulitpart/form-data sont un couple de ressources utiles dans le cas où quelqu'un a besoin d'une référence pour la spécification.
J'ai changé le WebHelpers classe pour être un peu plus petits et plus simples interfaces, il est maintenant appelé
FormUpload
. Si vous passez unFormUpload.FileParameter
vous pouvez passer le byte[] contenu le long avec un nom de fichier et le type de contenu, et si vous passez une chaîne de caractères, il va la traiter comme une norme nom/valeur de la combinaison.Ici est la FormUpload classe:
Voici le code appelant, qui télécharge un fichier et un peu de la normale des paramètres post:
Avec .NET 4.5 vous pourraient actuellement de l'utilisation du Système.Net.Espace de noms Http. Ci-dessous l'exemple pour le téléchargement de fichier unique à l'aide de plusieurs parties des données de formulaire.
Bâtiment sur dnolans exemple, c'est la version que j'ai pu réellement se rendre au travail (il y avait quelques erreurs avec la frontière, l'encodage n'est pas défini) 🙂
Pour envoyer les données:
La PostData classe devrait ressembler à:
Dans la version de .NET je suis avec vous aussi vous avez à faire cela:
Si vous ne le faites pas, le
HttpWebRequest
classe va ajouter automatiquement leExpect:100-continue
en-tête de requête qui encrasse le tout.Aussi j'ai appris à la dure que vous devez avoir le bon nombre de traits. ce que vous dites est la "limite" dans le
Content-Type
en-tête doit être précédé par deux tiretset à la fin
exactement comme dans l'exemple de code. Si votre limite est beaucoup de tirets suivis par un numéro, puis cette erreur ne sera pas évident en regardant la requête http à un serveur proxy
Merci pour le code, il m'a sauvé beaucoup de temps (y compris le Except100 erreur!).
De toute façon, j'ai trouvé un bug dans le code, ici:
Dans le cas où votre POST de données utf-16, postData.Longueur, sera de retour le nombre de caractères et non pas le nombre d'octets. Cela va tronquer les données affichées (par exemple, si vous avez 2 caractères sont encodés au format utf-16, ils prennent 4 octets, mais postData.Longueur de dire qu'il faut 2 octets, et vous perdez les 2 octets de données publiées).
De la Solution de remplacer cette ligne par:
À l'aide de cette, la longueur est calculée en fonction de la taille du byte[], pas la taille de la chaîne.
Un peu d'optimisation de la catégorie avant.
Dans cette version, les fichiers ne sont pas totalement chargé en mémoire.
Conseils de sécurité: une vérification de la limite est manquant, si le fichier contient les bounday il va se planter.
J'avais besoin de simuler un navigateur de connexion à un site web pour obtenir un cookie de connexion, et le formulaire de connexion est de type multipart/form-data.
J'ai pris quelques indices de la d'autres réponses ici, et a ensuite essayé d'obtenir mon propre scénario de travail. Il a fallu un peu frustrant d'essai et d'erreur avant il a travaillé tout, mais voici le code:
Il ne gère pas les fichiers de données, de la forme, puisque c'est tout ce dont j'avais besoin. Je l'ai appelé comme ceci:
Ci-dessous le code que j'utilise
à partir du lien suivant, j'ai téléchargé le même code
http://www.codeproject.com/KB/cs/multipart_request_C_.aspx
Toute Aide
Ma mise en œuvre