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

Другие вопросы по тегам