eBay FileTransferService - Пожалуйста, укажите файл в правильном формате
Я работаю с крупными торговыми службами eBay. Я успешно получил базовое задание AddFixedPriceItem для работы с использованием.NET HttpClient (наконец-то). Однако, в зависимости от содержимого моего XML-файла AddFixedPriceItem, ответ на задание uploadFile вернется:
Пожалуйста, укажите файл с допустимым форматом
Я не могу точно определить причину этой ошибки.
Пример № 1:
У меня есть файл с 2 AddFixedPriceItemRequest
запросы, которые будут успешно выполняться, и файл с 3 AddFixedPriceItemRequest
Запросы, которые не будут. Когда я хотел бы удалить некоторые NameValueList
теги из 3-го запроса, это будет работать. Я не вижу в этом ничего плохого или отличного NameValueList
теги, которые я удалил. Если я отправлю 3-й запрос сам, без удаления каких-либо тегов, он работает отлично.
Пример № 2:
У меня есть 1 AddFixedPriceItemRequest
запрос в файле, который содержит информацию CDATA для Description
тег (для значений HTML), который будет успешно повышаться, и другой файл с 2 AddFixedPriceItemRequest
запросы также содержат почти идентичные значения CDATA, но не будут работать. Если я удалю CDATA из добавленного второго запроса, он все равно не будет работать. Если я также удаляю CDATA из 1-го запроса (который успешно прошел первый раз), то он работает.
Я действительно смущен этим. Кажется, что нет никакого смысла и причины, по которой файл считается "действительным".
Ниже приведен пример запроса, который не удался: (SO, похоже, не берет Content-ID - но они есть).
POST http://storage.sandbox.ebay.com/FileTransferService HTTP/1.1 X-EBAY-SOA-SECURITY-TOKEN: ххх 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; граница ="MIME_boundary"; тип = "приложения / XOP + XML"; начать =""; старт-информация = "Текст / XML" Хост: storage.sandbox.ebay.com Длина содержимого: 3041 Ожидайте: 100-продолжение --MIME_boundary Тип контента: приложение /xop+xml Content-ID: Content-Transfer-Encoding: двоичный 1710zip5000867513450008489744 --MIME_boundary Тип контента: приложение / октет-поток Content-Transfer-Encoding: base64 Content-ID: UEsDBBQAAAAIAMZZ9UhnranV5gUAADYmAAAPACQAYWRkbGlzdGluZ3MueG1sCgAgAAAAAAABABgA4roeimLj0QE1N5fd4t3RAex2PDlG3dEB7Vptc9o4EP4rmny59kOxDZiXjOoZXppL5kjDxaG5+9QR9gJqbcsny2m4X38rgwEbmJ57zDWd8inSrvaRdq1dPRKh/TT4PGSKvXv2Fiyawz38lUKiEvIcBlHy9iKV0SVM2fKSxTy5hP6ozxIYiDAWEUQquXDoNTAfpEM/gEy4iJxuy6ZG3qEuV3AzdExqrFvUyA16vn/Fn8EfS+7BjYJwPfe/ п /qdlEKOcNkpm4MD0ceJS42ikD4yGfFoPoInCJxrPl9QoyA6sm69HocOmIK5kMtbFsdo0QsC8QV8R8kUqHFESQci8rlCFPTWMk10fVeC6jRScunoteZtOkilhMjT0iGK8x4dQuJJHmtbZ8h4JAKMIhmhGwqnJMPRda9lN6/e3PX7xP2Cojc9GRJrNYJcBUJIMmJhTHhE7nhA+jJNFuDjXxH9jT7s4tMhT2KmvMUDD+GWPTsYj7KI3kRPGHz0+kEy7zNOeAtqIXzH/W1CjWNKOhIey+YwO23Tosamn8XZjcHjM+4lDn3PQvjAghRGPFGrrtOXLPKpkbVpptyGAr9YJlipS5ZloNvx+xLMTviqIQkfghNhYQZOycMyhiLeNQvEHKLKUP8dZQBS6c+RfaEi3MDtEYNMRpXwrnjEk0UR6NBerBJ/9kwemVKY4UVczLcvlZDep+EUJBEzooOXlNAqQd09gWRBQIaYK5GuIiU0u0luohq5Jn8Qq5M1H3XTzJrHQ2qUUkRLMbX0jnGK9RPzakdHx9xTqYQhKMaDZNOf3I+chVLxpWHwcF6bCzQIa54IjZsQ45kYm+Qydvd07VM8p8YOxqaznUDykMllXhe35VMXQqtud6xt0cxOgj2DsRR+6qm1GxvgrAJg9q5bu+ т /ElCtLGZgNtzYWt5EXpD6AH22XM+Sw89YkIAuXscG5LauEt7n8UIoof0vmhV1dDIeOGbLrltNXFGnjo5rifb4oIO/pyxSXC2dFjU2bXoPGN5ojJ56m17S8zyIFfh3q6JdklLj8DC0nqVR3rvFE3TZxxKth+/I8zkeuVrw6C4/dpbJx4a5QS4oCwfUAzwr4m8FOqtkZkTizAlUZg6TBUiolU4fd8Gzc3QgEjVm3O8v13P00yVI5A/H9PnK8kDlAzfRzQWrlAmY2oKtMiXvuSCfMJdWuMmeHLerkPrLWFuAsqpsgwf62M21e2Z7w7VzxFsf/zfDtxfIBy4cs2bumeqRe+ZIqTKewYJMjXb7hqUx9EoC5EPWzKYg2gPYhMfYjzTmZEZssgZFUuA0Oo1Wo40SbFNXMamyeuVY7Q4Kt336wFUApyQ5tRpusRUqnUyw4DTqdpt5zGyD7zeb9S7zwJ/aDctn7VbLtGeYpJOsLq3In3GMoJ6p6ympqzv46kd1kYpEZLCQIjxz1m3cTkZZK0L9lIy1uAfPXPXFclV38ANRVZ15L4mpWs0zUz0z1Z+YqXZOwlQrc5pdmtpldrfV9L0mq0MTZmxarzPPt6yuz5jFWPdMU/9nmtpumKvLR8//lCaKTQM4P7FWoKt5/E7BV78JqxfHwZodkleTEdEq8F+X0OWS5EGrhp4kEE6DJdHZxSWUAvknJNXZtU7EIkyfkzHusFe/Nl+fyXoBT0ifHGLs/SDjDVWhRhDNVQnK/qUiTlZ0NKu4k3zOy24iK2GVAIfIkEpLsloX3/ Зв /hp0CSxFyqq2rFss8ZIjQS3dthTo7D/FNCT +wbcsa3vLam1uWZ2vXLIOzZTVdxaQK2D6nlOaB8+KKJkJGaJf61uAXw1eLYNSWPHExXMlFhJvRZi0ulzLaoXATed4hcNCTO6FCA/UqLsZlolqWxJZFx6lB7BWikpYu1E7yc7Sq9L7age4CHjL5hEo7lVC/SCCA28LdfOpEsoRBx+rgXBfLXAzDDn2VNm7zvHK8J3fDXJS8WM8HGwp0Et5OcAV1a3zb1znl4Of+OWg2dh/Oai36xVeDr7pmrn3I5fZsVseXortrj1tWp1Wt9Xw/DbzZzbmadOr8COXcex/w5x/AFBLAQItABQAAAAIAMZZ9UhnranV5gUAADYmAAAPACQAAAAAAAAAIAAAAAAAAABhZGRsaXN0aW5ncy54bWwKACAAAAAAAAEAGADiuh6KYuPRATU3l93i3dEB7HY8OUbd0QFQSwUGAAAAAAEAAQBhAAAANwYAAAAA --MIME_boundary--
Вот как я могу отправить запрос с помощью 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;
Я хотел бы отметить, что когда я загружаю этот файл, который не работает для меня с проектом LMS, с eBay ( https://ebaydts.com/eBayKBDetails?KBid=1338). Это заставляет меня думать, что я делаю что-то не так в своем коде - возможно, что-то связанное с тем, как я кодирую?
Любые идеи приветствуются.
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
1 ответ
Я наконец получил ответы. Сообщение "100 продолжить" дало мне необходимые подсказки. Я тратил слишком много времени, пытаясь понять прерывистую операцию.
1) Ваш код никогда не работает. Когда вы запускаете проект LMS, устанавливается cookie, который устанавливает настройки по умолчанию для вашего запроса. Таким образом, ваш код всегда будет работать после запуска LMS. Если вы удалите куки из своей истории IE, ваш код никогда не будет работать.
2) "Сообщение о продолжении 100" используется для "Chunk Mode" (не для потока). Библиотека Net по умолчанию использует HTTP 1.1 и большинство серверов в эти дни, когда см. 1.1 по умолчанию будет работать в режиме чанков. Сервер отправляет один чанк, но в сетевой библиотеке нет способа запросить второй чанк с сервера. Таким образом, соединение прерывается и прерывается. Единственный способ обойти эту проблему - установить HTTP-запрос на HTTP 1.0, который не поддерживает режим чанков, и сервер отправит ответ обратно в виде потока.
Попробуй это
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("URL");
request.ProtocolVersion = HttpVersion.Version10;
Смотрите также: Установить версию протокола HTTP в HttpClient
Посмотрите на 1-ю строку запроса, которая потерпела неудачу и имеет 1,1