2009-08-10 8 views
2

Existe-t-il un moyen d'obtenir le type de contenu de la réponse ou, inversement, de définir le type de contenu d'une demande sortante dans Silverlight à l'aide de WebClient?C# Silverlight WebClient obtenir le type de réponse de contenu?

Modifier

Je dois faire des requêtes http et être en mesure de réaliser des progrès pour eux. Je veux emballer les machines pour faire les demandes dans un module générique et l'utiliser partout dans mon code. C'est ce que j'ai déjà fait. La difficulté semble être lors de la soumission de différents types de données au serveur dans POST Je n'ai aucun moyen de dire au serveur quelles sont les données (json, xml, encoder le formulaire, binaire)

Je crois que je peux faire face à cela par en passant? content-type = x avec la requête, et en paramétrant le serveur pour le préférer sur l'en-tête Content-Type. J'ai également aucun moyen de savoir quel type de contenu le serveur répond, je pense que je peux résoudre cela en passant le type attendu des données lorsque je fais une demande.

Si quelqu'un a une meilleure solution, s'il vous plaît parler :)

/Modifier

Voilà ma situation. Les objets HttpWebRequest/Response implémentent une interface interne qui permet de surveiller la progression de la requête. Si vous souhaitez effectuer des requêtes volumineuses, il est très important que l'utilisateur puisse voir une barre de progression indiquant l'état du téléchargement/téléchargement.

L'utilisation de HttpWebRequest/Response est donc terminée. Ne laissant que WebClient, mais je trouve des choses étranges à ce sujet.

Il ne peut pas être sous-classé. Ce n'est pas réellement scellé, mais le constructeur est marqué [SecuritySafeCritical], ce qui, pour autant que je sache, signifie que je ne peux pas l'appeler à partir d'une classe dérivée. Au moins, j'ai échoué, et trouvé d'autres sur Google qui avaient échoué, mais je serais très heureux d'avoir tort sur ce point.

En interne, il utilise BrowserHttpWebResponse, qui ne remplace pas la propriété abstraite Headers, et WebClient.ResponseHeaders juste vers m_Response.Headers, qui lance simplement NotImplementedException.

Je ne suis pas sûr que Content-Type serait même dans ResponseHeaders, mais j'aurais aimé vérifier.

Il semble que nous ayons le choix malheureux d'avoir des informations de progression ou des informations sur le type de contenu mais pas les deux dans Silverlight. Selon les docs, il ne semble pas non plus possible de définir Content-Type sur la requête sortante avec WebClient. Content-Type est répertorié en tant qu'en-tête restreint. Je n'ai pas encore testé cela.

Bien qu'il soit intéressant de noter que sur une erreur, vous réellement obtenir passé l'objet de réponse et avoir accès à StatusCode, Content-Type, etc.

+0

Qu'essayez-vous d'accomplir? Quel est votre but ultime? Vous avez expliqué les méthodes que vous avez essayées mais vous n'avez pas expliqué ce que vous essayez de faire. –

Répondre

0

Une solution plus simple consisterait à faire en sorte que le code client/serveur casse le chargement/téléchargement en morceaux et les envoie un à la fois. Vous pouvez ensuite mettre à jour votre barre de progression après chaque segment. Bien sûr, plus la taille de votre morceau est petite, plus il sera lent.

En outre: vous pouvez indiquer au serveur quel type de contenu il est via l'argument de chaîne de requête?

+0

En fait, je me suis rabattu sur une stratégie comme celle-ci, et cela fonctionne en quelque sorte. – Eloff

0

Avez-vous essayé d'utiliser le WebClient et l'événement DownloadProgressChanged sur le WebClient ?

+0

Oui, comme je l'ai dit plus haut, cela semble être le seul moyen d'obtenir des informations sur la progression du téléchargement. Mais alors le problème est que WebClient a une interface pour les nuls qui n'expose pas quelque chose de plus avancé (comme Content-Type) donc si vous avez besoin de progrès et de fonctionnalités avancées, vous n'avez vraiment aucune option. – Eloff

0

Vous pouvez le faire comme this si votre serveur est asp.net ou comme this si c'est php. Ce sont des solutions pour les progrès de téléchargement, ils pourraient être en mesure d'être modifiés pour la progression du téléchargement, mais pas facilement.L'idée est qu'ils ont réécrit le code du serveur qui effectue le téléchargement pour enregistrer la progression avec un ID, puis le client interroge le serveur pour obtenir la progression en cours.

Questions connexes