3

Je cherche à renvoyer une image à partir d'un serveur en utilisant Silverlight 3. Le serveur renvoie le flux de réponse comme ceci:flux de réponse d'ouverture dans silverlight

context.Response.ContentType = imageFactory.ContentType 
imgStream.WriteTo(context.Response.OutputStream) 
imgStream.Close() 
context.Response.End() 

Sur le client Silverlight Je suis en charge du flux comme:

Dim request As HttpWebRequest = result.AsyncState 
    Dim response As HttpWebResponse = request.EndGetResponse(result) 
    Dim responseStream As IO.Stream = response.GetResponseStream() 

Je veux prendre ce cours d'eau et ouvrir par les navigateurs de dialogue, une option que j'ai exploré est d'utiliser le Html.Window.Navigate (New Uri (« URL de l'image »)), ce qui a ouvert la boîte de dialogue par défaut du navigateur correct mais ce n'est pas une option parce que j'ai besoin d'envoyer des informations étendues (par exemple XML) à le serveur à travers le HttpRequest.Headers.Item et le Navigate ne le permet pas.

Comment puis-je prendre un flux de réponse et forcer la boîte de dialogue Enregistrer le navigateur par défaut à apparaître à partir de l'application Silverlight sans utiliser Html.Window.Navigate (New Uri ("image url"))?

Répondre

2

La réponse directe est que vous ne pouvez pas, le Silverlight SaveFileDialog ne peut être ouvert en tant que résultat direct d'une interaction de l'utilisateur comme un clic sur un bouton.

La solution à ce genre de problème (où vous voulez un téléchargement) est de publier le XML sur le serveur pour le stockage disons dans l'objet session ou en tant que fichier. La réponse est une poignée que vous pouvez utiliser pour récupérer le XML tel que GUID.

Vous pouvez ensuite utiliser une navigation standard en plaçant le GUID dans la chaîne de requête de l'URL. Le script de réception (l'ashx est ce cas) peut récupérer le code XML précédemment affiché en utilisant le handle fourni dans l'URL.

Vous voulez également coder la réponse côté serveur comme ceci: -

context.Response.ContentType = imageFactory.ContentType; 
context.Response.AddHeader("Content-Disposition", "attachment;file=someimage.jpg"); 
imgStream.WriteTo(context.Response.OutputStream); 
imgStream.Close(); 

cela provoquera le navigateur pour afficher une « Ouvrir ou Enregistrer boîte de dialogue ». Normalement, l'état de navigation de la fenêtre actuelle est maintenu de sorte que votre application SL doit rester dans son état actuel mais je n'ai pas testé cela.

BTW, notez pas Response.End(), c'est une chose horrible à faire, si vous pouvez l'éviter alors faites-le.

+0

Merci, Anthony. Cela fonctionne et l'application SL conserve son état actuel. Question: Quelle est la raison de ne pas utiliser Response.End()? –

+0

@John: Response.End() lève ThreadAbortException et tue tout autre traitement de réponse, y compris tout post-traitement qui pourrait se produire dans les modules. C'est beaucoup mieux de laisser le code arriver à sa fin naturelle que de le tuer de façon si spectaculaire. – AnthonyWJones