2
votes

Impossible d'accéder à la table de stockage Azure à l'aide de SAS via c #. Fonctionne dans le facteur et le navigateur

J'essaie d'obtenir et d'analyser une table à partir d'Azure Storage.

J'ai généré une signature d'accès partagé dans Azure Storage Explorer.

Si je colle l'URL générée dans le navigateur ou le facteur, j'obtiens le table au format xml.

Cependant, essayer de faire une HttpWebRequest avec l'URL aboutit à

System.Net.WebException: 'Le serveur distant a renvoyé une erreur: (415) Type de média non pris en charge.'

J'ai essayé différents contenus et j'accepte différents types

  request.Accept = "application/json";
     request.ContentType = "application/json";

J'ai essayé à la fois

 request.ContentType = "application/xml";

et

request.Accept = "application/xml";

mais j'obtiens toujours la même erreur.

J'ai également essayé de créer et d'accéder à une nouvelle table avec seulement des données simples. Les données accessibles via le navigateur sont valides xml, mais j'obtiens toujours la même erreur de l'application ac #.

La solution consistait à utiliser à la fois le type de contenu et les formats d'acceptation suivants

const string url = @"https://laptopdeploymentfiles.table.core.windows.net/PaulLoginScript?st=2019-08-21T08%3A10%3A22Z&se=2019-08-22T08%3A10%3A22Z&sp=r&sv=2018-03-28&tn=paulloginscript&sig=***";

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);

request.Method = "GET";

var webResponse = request.GetResponse();


0 commentaires

3 Réponses :


0
votes

Je pense que vous devez indiquer à votre demande le type de données à attendre. Essayez d'ajouter ceci:

const string url = @" -- used my own xml file in Azure Blob Storage --";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "GET";
request.ContentType = "application/xml";
var webResponse = request.GetResponse();

Je n'ai pas testé, donc je ne peux pas promettre que cela fonctionnera. Faites-moi savoir si c'est le cas!

EDIT:

Paul, j'ai testé ce code ci-dessous:

request.ContentType = "application/xml";

Cela a fonctionné sans erreur. webResponse a été rempli correctement. Je viens de créer une application console et d'y mettre ces 5 lignes de code, puis de passer en mode débogage pour voir ce qui se passerait.

Je me demande ce qui est différent dans votre environnement? Pourriez-vous essayer d'isoler ces lignes de code?

EDIT 2:

Juste une pensée ... êtes-vous sûr que le XML de votre fichier est valide?


12 commentaires

Merci pour votre suggestion. J'avais déjà essayé mais essayé de nouveau pour m'en assurer. Toujours obtenir la même erreur: System.Net.WebException: «Le serveur distant a renvoyé une erreur: (415) Type de support non pris en charge.


D'accord. Eh bien, tant pis pour la simple explication! L'erreur se produit-elle sur cette ligne: var webResponse = request.GetResponse ();


D'accord. J'y pense toujours. Je ferai quelques tests et je vous répondrai.


Je pense que vous êtes sur la bonne voie mais le mauvais attribut. Les requêtes GET n'ont pas de charge utile, de sorte que le serveur avec lequel vous communiquez peut ne pas aimer que vous spécifiiez un Content-Type dans la requête. essayez request.Accept = "application / xml";


@PaulPrichard, voyez les modifications apportées à ma réponse. Cela vaut également la peine d'essayer ce qu'Edney a suggéré.


Serait-ce parce que j'essaye de renvoyer une table azur? J'ai mis juste ces lignes dans une application console et j'ai le même problème.


@PaulPrichard, vous êtes peut-être sur quelque chose. Voir mon Edit # 2 ci-dessus. Le contenu du fichier est-il XML valide?


heureux que nous y soyons arrivés! Si ma réponse vous a aidé, pouvez-vous la vérifier comme étant la bonne réponse?


@CaseyCrookston, en y regardant de plus près, le contenu renvoyé dans le navigateur est un xml valide. Toutes mes excuses pour les informations erronées


@EdneyHolder, j'ai essayé request.Accept = "application / xml", et même erreur.


@CaseyCrookston les données dans azure ne sont pas au format xml, c'est une table. Les données renvoyées via le lien dans un navigateur sont en xml et elles sont valides en xml


@PaulPrichard, le code semble correct. Il se passe autre chose ici, en dehors de ces 5 lignes de code. Sans accès à votre lien réel, nos mains sont un peu liées.



1
votes

Tester votre scénario spécifique et le faire fonctionner en utilisant le Classe HttpClient .

Voici le code que j'ai utilisé pour le faire fonctionner:

// Create an instance of HttpClient with the BaseAddress
var client = new HttpClient
{
    BaseAddress = new Uri("https://<STORAGE_NAME>.table.core.windows.net/")
};

// Add an Accept Header to tell the service you're expecting the data in JSON format
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

// Get the actual table
var result = await client.GetAsync("<REST_OF_THE_URI");

En omettant l'en-tête Accept, ce code donne le message d'erreur :

Le format Atom n'est pas pris en charge.

MODIFIER
Tiré de Tables de requête - En-têtes de requête a > sur l'en-tête Accept, vous pouvez spécifier:

Facultatif. Spécifie le type de contenu accepté de la charge utile de réponse. Les valeurs possibles sont:

  • application / atom + xml (versions antérieures au 11/12/2015 uniquement)
  • application / json; odata = nometadata
  • application / json; odata = métadonnées minimales
  • application / json; odata = fullmetadata


0 commentaires

1
votes

La solution consistait à utiliser à la fois le type de contenu suivant et à accepter les formats

request.Accept = "application/json";
request.ContentType = "application/json";


0 commentaires