Question

J'ai un problème avec mon navigateur qui ne reconnaît pas les types de contenu que j'envoie dans mes réponses et tente de télécharger le fichier au lieu de l'afficher.

J'ai un gestionnaire générique (nommé SPARQL.ashx) écrit en ASP.Net qui fonctionne et produit un objet de deux types possibles. Soit il obtient un SPARQLResultSet ou un graphique, puis il définit le type de contenu approprié avant d'utiliser la méthode Save appropriée pour envoyer le contenu à l'utilisateur. Le fragment de code est ci-dessous:

  //Execute the Query
  Object result = store.ExecuteQuery(sparqlquery);

  if (result is SPARQLResultSet) 
  {
        //Return as SPARQL Results XML Format
        context.Response.ContentType = MIMETypesHelper.SPARQL[0];
        SPARQLResultSet resultset = (SPARQLResultSet)result;
        resultset.Save(new StreamWriter(context.Response.OutputStream));
  } 
  else if (result is Graph) 
  {
        //Return as Turtle
        context.Response.ContentType = MIMETypesHelper.Turtle[0];
        Graph g = (Graph)result;
        TurtleWriter ttlwriter = new TurtleWriter();
        ttlwriter.PrettyPrintMode = true;
        ttlwriter.Save(g, new StreamWriter(context.Response.OutputStream));
  }

Mon problème est que mon navigateur demande souvent de télécharger les résultats plutôt que de les afficher alors qu'un format est basé sur XML et l'autre sur du texte brut. Les deux doivent donc pouvoir être affichés dans n'importe quel navigateur moderne.

Le comportement varie d’un navigateur à l’autre et certains invitent au téléchargement, quel que soit le format du résultat, d’autres le seront pour l’un mais pas l’autre.

Suis-je susceptible de devoir configurer IIS pour que les types MIME corrects soient envoyés? Pour mémoire, j'ai les extensions de fichiers officielles et les types MIME enregistrés dans IIS. Ou est-ce un problème avec le fait que j'utilise un gestionnaire générique? Ou quelqu'un a-t-il d'autres idées sur la raison pour laquelle cela pourrait se produire?

Modifier

Ajout du code de la classe MIMETypesHelper pour plus de clarté

/// <summary>
/// Helper Class containing arrays of MIME Types for the various RDF Concrete Syntaxes
/// </summary>
/// <remarks>The first type in each array is the canonical type that should be used</remarks>
public class MIMETypesHelper
{
  /// <summary>
  /// MIME Types for Turtle
  /// </summary>
  public static string[] Turtle = { "text/turtle", "application/x-turtle", "application/turtle" };

  /// <summary>
  /// MIME Types for RDF/XML
  /// </summary>
  public static string[] RDFXML = { "application/rdf+xml" };

  /// <summary>
  /// MIME Types for Notation 3
  /// </summary>
  public static string[] Notation3 = { "text/n3", "text/rdf+n3" };

  /// <summary>
  /// MIME Types for NTriples
  /// </summary>
  public static string[] NTriples = { "text/plain" };

  /// <summary>
  /// MIME Types for SPARQL Result Sets
  /// </summary>
  public static string[] SPARQL = { "application/sparql-results+xml" };

  ///etc.
}
Était-ce utile?

La solution 4

Finalement, vous avez trouvé la source du problème. Il semble que vous deviez appeler Clear () sur la réponse et utiliser la mise en mémoire tampon ou l'en-tête Type de contenu ne soit pas envoyé comme prévu:

par exemple.

//Return as Turtle
context.Response.ContentType = MIMETypesHelper.Turtle[0];

//Clear any other output from this Response
//Then use buffering
context.Response.Clear();
context.Response.BufferOutput = true;

//Write the Output
Graph g = (Graph)result;
TurtleWriter ttlwriter = new TurtleWriter();
ttlwriter.PrettyPrintMode = true;
ttlwriter.Save(g, new StreamWriter(context.Response.OutputStream));

Autres conseils

D'après votre code, il semble que vous utilisiez les types MIME de la bibliothèque rdf (vous ne dites pas lequel). Lorsqu'un navigateur tel que firefox / IE (vous ne dites pas lequel vous utilisez) voit un type mime application/ SOMETHING , il propose généralement de l'enregistrer plutôt que de le visualiser.

Le type mime pour RDF / XML est application/rdf+xml (je le sais depuis que j'ai écrit la spécification) et cela entraînera l'approche de sauvegarde. Le type mime pour Turtle (que j'ai créé dans la note Turtle ) n'est pas enregistré, mais il est suggéré d’être text/turtle ce qui devrait s’afficher correctement.

À quoi correspond l'en-tête Content-Dispostion ? Il devrait être réglé sur & "Inline &"; Vous voudrez peut-être essayer de le définir manuellement pour voir si le comportement change.

Dans notre famille de moteurs de stockage RDF, nous attaquons ce problème en négociant le contenu.

C’est-à-dire que nous vérifions la ligne Accepter dans les en-têtes de la requête HTTP et ajustons notre comportement en conséquence. Si la ligne Accept mentionne explicitement des types RDF ou si le type MIME des résultats SPARQL est explicite, nous renvoyons le type de contenu et la réponse associée appropriés. Ceci sert aux clients SPARQL dédiés, au code roulé à la main et à divers RDF & "; Navigateur &"; outils très bien dans notre expérience.

Mais pour un navigateur Web typique, la ligne Accept ne répertorie que le HTML et quelques formats d'image, et notre démon HTTP définit le type de contenu sur text / plain (ou pour une requête SPARQL vide, text / html, avec le corps de la réponse en tant que page Web avec un formulaire permettant de rédiger des requêtes manuelles à partir d’un navigateur Web à des fins de test)

Enfin, si l'en-tête Accept est complètement manquant, nous savons qu'il s'agit d'un logiciel très naïf, très probablement du script Perl de quelqu'un ou quelque chose du genre, et nous avons un cas à part qui facilite la vie des utilisateurs lors du développement contre le moteur de stockage. / p>

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top