2016-07-20 3 views
1

Je travaille avec les grands services marchands eBay. J'ai réussi à faire fonctionner le travail de base AddFixedPriceItem en utilisant .NET HttpClient (enfin). Toutefois, en fonction du contenu de mon fichier XML AddFixedPriceItem, la réponse à la tâche UploadFile retournerait:eBay FileTransferService - S'il vous plaît spécifier un fichier avec un format valide

S'il vous plaît spécifier un fichier avec le format valide

Je ne suis pas en mesure d'identifier la cause cette erreur.

Exemple # 1:

Je dispose d'un fichier avec 2 AddFixedPriceItemRequest demandes, qui monterait avec succès, et un fichier avec 3 AddFixedPriceItemRequest demandes qui ne. Quand je voudrais supprimer quelques balises NameValueList de la 3ème demande, cela fonctionnerait. Je ne vois rien de mal ou de différent avec ces balises NameValueList que j'ai retirées. Si j'envoie la 3ème requête par elle-même, sans enlever les tags, cela fonctionne parfaitement.

Exemple # 2:

Je 1 AddFixedPriceItemRequest demande dans un fichier qui contient des informations CDATA pour la balise Description (pour les valeurs HTML), qui monterait avec succès, et un autre fichier avec 2 AddFixedPriceItemRequest requêtes contenant également presque valeurs CDATA identiques mais ne fonctionnerait pas. Si je supprime le CDATA de la seconde requête ajoutée, cela ne fonctionne toujours pas. Si je supprime également le CDATA de la 1ère requête (qui s'est déroulée avec succès tout seul la première fois), cela fonctionne.

Je suis vraiment confus par cela. Il semble qu'il n'y ait pas de rime ni de raison de savoir quel fichier est considéré comme "valide".

Voici un exemple d'une requête qui a échoué: (ne semblent si pas prendre le Content-ID - mais ils sont là.)

 
POST http://storage.sandbox.ebay.com/FileTransferService HTTP/1.1 
X-EBAY-SOA-SECURITY-TOKEN: xxx 
X-EBAY-SOA-SERVICE-NAME: FileTransferService 
X-EBAY-SOA-SERVICE-VERSION: 1.0.0 
X-EBAY-SOA-OPERATION-NAME: uploadFile 
X-EBAY-SOA-OPERATION-FORMAT: XML 
Content-Type: multipart/related; boundary="MIME_boundary"; type="application/xop+xml"; start=""; start-info="text/xml" 
Host: storage.sandbox.ebay.com 
Content-Length: 3041 
Expect: 100-continue 

--MIME_boundary 
Content-Type: application/xop+xml 
Content-ID: 
Content-Transfer-Encoding: binary 

1710zip5000867513450008489744 
--MIME_boundary 
Content-Type: application/octet-stream 
Content-Transfer-Encoding: base64 
Content-ID: 

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 
--MIME_boundary-- 

Voilà comment j'envoie la demande avec HttpClient:

byte[] data; 
long fileLength; 
var uuidRequest = Guid.NewGuid().ToString(); 
var uuidAttachment = Guid.NewGuid().ToString(); 

using (FileStream fs = File.OpenRead(filePath)) 
{ 
    data = new byte[fs.Length]; 
    fs.Read(data, 0, data.Length); 
    fileLength = fs.Length; 
} 

var xml = 
    "<?xml version=\"1.0\" encoding=\"utf-8\"?>" + 
    "<uploadFileRequest xmlns=\"http://www.ebay.com/marketplace/services\">" + 
     "<fileAttachment>" + 
      "<Data><xop:Include href=\"cid:urn:uuid:" + uuidAttachment + "\" xmlns:xop=\"http://www.w3.org/2004/08/xop/include\"/></Data>" + 
      "<Size>" + fileLength + "</Size>" + 
     "</fileAttachment>" + 
     "<fileFormat>zip</fileFormat>" + 
     "<fileReferenceId>" + fileReferenceID + "</fileReferenceId>" + 
     "<taskReferenceId>" + jobID + "</taskReferenceId>" + 
    "</uploadFileRequest>"; 


var multippartcontent = new MultipartContent("related", "MIME_boundary"); 
multippartcontent.Headers.Remove("Content-Type"); 
multippartcontent.Headers.TryAddWithoutValidation("Content-Type", string.Format("multipart/related; boundary=\"MIME_boundary\"; type=\"application/xop+xml\";start=\"<0.urn:uuid:{0}>\";start-info=\"text/xml\"", uuidRequest)); 

var content = new StringContent(xml); 
content.Headers.ContentType = new MediaTypeHeaderValue("application/xop+xml"); 
content.Headers.Add("Content-ID", string.Format("<0.urn:uuid:{0}>", uuidRequest)); 
content.Headers.TryAddWithoutValidation("Content-Transfer-Encoding", "binary"); 
multippartcontent.Add(content); 

var attachmentContent = new StringContent(Convert.ToBase64String(data)); 
attachmentContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream"); 
attachmentContent.Headers.TryAddWithoutValidation("Content-Transfer-Encoding", "base64"); 
attachmentContent.Headers.Add("Content-ID", string.Format("<urn:uuid:{0}>", uuidAttachment)); 
multippartcontent.Add(attachmentContent); 


var uploadFileResp = httpclient.PostAsync(ftServiceUrl, multippartcontent).Result.Content.ReadAsStringAsync().Result; 

Je note, quand je télécharge ce même fichier qui ne fonctionne pas pour moi avec le projet LMS d'eBay (https://ebaydts.com/eBayKBDetails?KBid=1338). Cela m'amène à penser que je fais quelque chose de mal dans mon code - peut-être quelque chose à voir avec la façon dont je suis en train d'encoder?

Toutes les idées sont appréciées.

réponse HTTP

HTTP/1.1 200 OK 
Server: Apache-Coyote/1.1 
X-EBAY-SOA-SERVICE-METRICS: 455075973 
X-EBAY-SOA-REQUEST-ID: 15613449-f630-a471-d2d4-ec64ffff71c7!FileTransferService!10.71.29.45!v3apibulksandboxcore[] 
X-EBAY-SOA-SERVICE-VERSION: 1.1.0 
X-EBAY-SOA-MESSAGE-PROTOCOL: NONE 
X-EBAY-SOA-RESPONSE-DATA-FORMAT: XML 
X-EBAY-SOA-OPERATION-NAME: uploadFile 
X-EBAY-SOA-SERVICE-NAME: {http://www.ebay.com/marketplace/services}FileTransferService 
Content-Type: text/xml;charset=UTF-8 
Transfer-Encoding: chunked 
Date: Fri, 22 Jul 2016 15:41:19 GMT 

1cd 
<?xml version='1.0' encoding='UTF-8'?><uploadFileResponse xmlns="http://www.ebay.com/marketplace/services"><ack>Failure</ack><errorMessage><error><errorId>11</errorId><domain>Marketplace</domain><severity>Error</severity><category>Application</category><message>Please specify a File with Valid Format</message><subdomain>FileTransfer</subdomain></error></errorMessage><version>1.1.0</version><timestamp>2016-07-22T15:41:20.118Z</timestamp></uploadFileResponse> 
0 
+0

J'utilise habituellement Fiddler dans ces cas. Je capturerais d'abord les résultats du violoniste avec le projet LMS. Puis comparez les résultats avec l'application C#. Je voudrais vérifier les en-têtes dans les captures de violoniste pour voir ce qui est différent. – jdweng

+0

Il existe des différences dans la demande de projet LMS. 1. il utilise SOAP 2. le contenu du fichier semble être envoyé différemment binaire vs base64 -, bien que ce que j'ai trouvé est que base64 est recommandé (fils de discussion/blogs blog ebay). Le contenu ressemble plus à: "addW addlistings.xml YY 0 +^I уcE -d! D 8 Ҁ  \t T/= g = Qi/\t> f ESx \t PZ yD DF" – Rivka

+0

Modifier votre en-tête "Content-Transfert- Encodage "pour correspondre à ce qui est utilisé dans le projet LMS. Vous savez que cela fonctionne, pourquoi utiliser quelque chose de différent. C'est probablement GZIP. Voir: http://stackoverflow.com/questions/19006997/c-sharp-httpwebrequest-using-gzip-compression – jdweng

Répondre

0

J'ai finalement obtenu les réponses. Le message "100 continue" m'a donné les indices nécessaires. Je passais trop de temps à essayer de comprendre l'opération intermittente.

1) Votre code ne fonctionne jamais vraiment. Lorsque vous exécutez le projet LMS, un cookie est établi qui configure le paramètre par défaut pour votre requête. Votre code fonctionnera donc toujours après l'exécution du LMS. Si vous supprimez les cookies de votre historique IE, votre code ne fonctionnera jamais.

2) Le message "100 continue" est utilisé pour "Chunk Mode" (pas de flux). La bibliothèque Net par défaut est HTTP 1.1 et la plupart des serveurs ces jours où le voir 1.1 par défaut en mode bloc. Le serveur envoie un bloc, mais il n'y a aucun moyen dans la bibliothèque Net de demander un deuxième bloc à partir du serveur. Ainsi, la connexion expire et échoue. Le seul moyen de contourner ce problème consiste à définir la requête HTTP à HTTP 1.0 qui ne prend pas en charge le mode tronçon, le serveur enverra la réponse en tant que flux.

Essayez cette

  HttpWebRequest request = (HttpWebRequest)WebRequest.Create("URL"); 
      request.ProtocolVersion = HttpVersion.Version10; 

Voir aussi: Set HTTP protocol version in HttpClient

Regardez 1ère ligne de la demande qui a échoué, qui a 1,1

+0

J'apprécie votre réponse, mais: 1. * Donc, votre code fonctionnera toujours après l'exécution du LMS. * - cette déclaration est incorrecte. Même après l'exécution de LMS, cela ne fonctionne pas, et les fichiers qui marchent fonctionnent même si je n'exécute pas LMS auparavant. Je ne vois pas non plus ce que cela a à voir avec les cookies IE. 2. Je n'utilise pas HttpWebRequest et le projet LMS contient également l'en-tête Expect: 100-continue. D'autres idées? – Rivka

+0

Avez-vous regardé le lien que j'ai fourni pour HttpClient? Avez-vous essayé le correctif? Quand code-t-on le travail et quand échoue-t-il? Lorsqu'un cookie existe entre un client et un serveur, la Net Library utilise les paramètres précédents au lieu des paramètres par défaut. Donc, une fois qu'une connexion Http a été établie entre un client et un serveur en utilisant 1.0, la nouvelle connexion suivante utilisera également 1.0. Vous échouerez toujours avec Net Library si l'en-tête Http contient 1.1. – jdweng

+0

Les 2 lignes de code ne semblaient pas fonctionner. Jusqu'à présent, je suis tombé sur 2 scénarios où le code ne fonctionne pas: comme je l'ai mentionné dans mon OP: CDATA et les scénarios NameValueLists mais je suis sûr qu'il y a plus d'incohérences - je ne fais que commencer ici. L'objectif ici est de télécharger en * bulk * comme dans des milliers de demandes à la fois; à ce rythme, et en fonction de la quantité de problèmes d'API que j'ai déjà rencontrés, je ne peux pas le voir se produire. En ce qui concerne les cookies: en regardant fiddler, je ne vois pas de cookies renvoyés par les réponses d'eBay. – Rivka