2016-07-12 2 views
3

Я пытаюсь изменить цену изделия, используя сайты API документация для него находится в https://www.mkmapi.eu/ws/documentation/API_1.1:StockПопытка загрузить с запросом PUT

При запуске класса я получаю сообщение об ошибке 417 Expectation Failed, который описанных в документации: Обычно вы получаете код состояния статуса 417 с ожиданием, если ваш запрос имеет тело XML без соответствующего заголовка и/или тела, не отправленного как текст, а его байтового представления. Другой возможной причиной для 417 является, когда вы отправляете данные тела с более чем 1,024 байтами без добавления заголовка Expect: к вашему запросу.

Любая помощь будет оценена по достоинству. Я также должен сказать, что проверка подлинности не является проблемой, я могу загрузить цены своей статьи.

public void UpdateMarketPrice(string MarketID, string NewPrice) 
{ 
    // https://www.mkmapi.eu/ws/documentation/API_1.1:Stock 

    String finalResult; 
    String method = "PUT"; 
    String url = "https://www.mkmapi.eu/ws/v1.1/stock"; 

    HttpWebRequest request = WebRequest.CreateHttp(url) as HttpWebRequest; 
    OAuthHeader header = new OAuthHeader(); 
    request.Headers.Add(HttpRequestHeader.Authorization, header.getAuthorizationHeader(method, url)); 
    request.Method = method; 
    request.ContentType = "text/xml; encoding='utf-8'"; 

    XElement xmlDoc = 
     new XElement("request", 
      new XElement("article", 
       new XElement("idArticle", MarketID), 
       new XElement("idLanguage", 1), 
       new XElement("comments", "Edited through the API"), 
       new XElement("count", 7), 
       new XElement("price", 11), 
       new XElement("condition", "NM"), 
       new XElement("isFoil", false), 
       new XElement("isSigned", false), 
       new XElement("isPlayset", false) 
      ) 
     ); 

    String finalXML = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" + xmlDoc.ToString(); 
    MessageBox.Show(finalXML); 
    byte[] bytes = Encoding.ASCII.GetBytes(finalXML); 
    request.ContentLength = bytes.Length; 

    using (Stream putStream = request.GetRequestStream()) 
    { 
     putStream.Write(bytes, 0, bytes.Length); 
    } 

    using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
    using (StreamReader reader = new StreamReader(response.GetResponseStream())) 
    { 
     finalResult = reader.ReadToEnd(); 
    } 

    MessageBox.Show(finalResult); 
} 

ответ

2

Я прочитал, что HttpWebRequest добавляет заголовок «ожидать 100 продолжить» к запросам, если вы не отключите его. Есть серверы, которые, возможно, не поддерживают этот заголовок. И будет выдано это сообщение о неудачном ожидании 417.

Вы можете попробовать установить его в ложное:

Так заголовок не отправляется.

Я видел это предлагаемое решение для других подобных вопросов.

+0

Удивительно, что работает! Спасибо огромное! –

+0

Рад это слышать! Я фактически столкнулся с той же проблемой с mkmapi вчера, но у меня не было времени, чтобы попытаться разрешить для себя, так как я на работе. – Tim

0

Возможно использование StreamWriter?

using (Stream putStream = request.GetRequestStream()) 
{  
    using (var writeStream = new StreamWriter(putStream, Encoding.ASCII)) 
    { 
     writeStream.Write(finalXML); 
    } 
    request.ContentLength = putStream.Length; // I am not sure about that 
} 
+0

Спасибо за предложение Slai, я попробовал ваш код, но теперь я получаю еще одну ошибку System.NotSupportedException. Дополнительная информация: Этот поток не поддерживает операции поиска. –

Смежные вопросы