Отправить XML через WebClient Post, используя MemoryStream - PullRequest
2 голосов
/ 27 октября 2011

Я пытаюсь отправить файл XML, который я создал в своем потоке памяти.Проблема возникает, когда я пытаюсь использовать UploadFile и получаю ошибку Invalid Arguments.У меня вопрос, могу ли я в любом случае использовать свой поток памяти, созданный с помощью WebClient.UploadFile, для отправки файла или мне нужно сделать это другим способом?

Ответы [ 3 ]

9 голосов
/ 27 октября 2011

РЕДАКТИРОВАТЬ: Отредактировано в 2013 году, похоже, это было совершенно неправильно, когда я первоначально ответил ...

Опции:

  • Возьмите байтовый массив из MemoryStream и используйте UploadData

    client.UploadData("http://test.com/test.aspx", ms.ToArray());
    
  • Используйте взамен OpenWrite и запишите в возвращенный поток

    using (var stream = client.OpenWrite("http://test.com/test.aspx"))
    {
        using (XmlWriter xml = XmlWriter.Create(stream, settings))
        {
            ...
        }
    }
    
  • Запишите данные в файл и затем используйте UploadFile

    using (XmlWriter xml = XmlWriter.Create("tmp.xml", settings))
    {
        ...
    }
    client.UploadFile("http://test.com/test.aspx", "tmp.xml");
    // Delete temporary file afterwards
    

Я бы лично выбрал один из первых двух подходов, чтобы избежать временного файла.

6 голосов
/ 27 октября 2011

За ваш Invalid Arguments:

Я не вижу методов для WebClient.UploadFile поддерживает MemoryStream. Преобразуйте MemoryStream в String и используйте WebClient.UploadString .

0 голосов
/ 13 мая 2016

Я пытаюсь сделать то же самое. Я попытался использовать несколько возможных решений, но безуспешно.

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

using (FileStream src = System.IO.File.Open(@"C:\XML\OrderXML.txt", FileMode.Open))
            {
                src.CopyTo(ms);
            }

            using (WebClient wc = new WebClient())
            {
                wc.Headers[HttpRequestHeader.ContentType] = "text/xml";
                wc.Headers[HttpRequestHeader.AcceptEncoding] = "Encoding.UTF8";
                //wc.Headers[HttpRequestHeader.ContentLength] = ms.Length.ToString();                    
                wc.UploadString(sURL, ms.ToString());
            }

мой контроллер RESTful API MVC:

 [System.Web.Http.HttpPost]
    public async void CreateJob(string filename)
    {
        string success = "false";
        try
        {
            //XDocument doc = XDocument.Load
            XmlSerializer xmls = new XmlSerializer(typeof(PdnaXmlParse));
            Stream reqStream = await Request.Content.ReadAsStreamAsync();
            PdnaXmlParse res = (PdnaXmlParse)xmls.Deserialize(new XmlTextReader(reqStream));
        }
        catch (Exception ex)
        {
            Console.Write(ex.Message);
        }
}
...