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