使用MemoryStream通过WebClient Post发送XML

atr*_*joe 2 c# xml asp.net webclient memorystream

我正在尝试发送我在内存流中创建的XML文件.当我尝试使用UploadFile并获得无效参数的错误时,问题就出现了.我的问题是,无论如何我可以使用我创建的内存流WebClient.UploadFile来发送文件或者我是否需要以其他方式执行此操作?

string firstname = Request.Headers["firstname"].ToString();
string lastname = Request.Headers["lastname"].ToString();
string organization = Request.Headers["organization"].ToString();
string phone = Request.Headers["phone"].ToString();

XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
MemoryStream ms = new MemoryStream();
using (XmlWriter xml = XmlWriter.Create(ms, settings))
{
    xml.WriteStartDocument();
    xml.WriteStartElement("List");
    xml.WriteWhitespace("\n");

    xml.WriteStartElement("Employee");
    {
        xml.WriteElementString("First", firstname);
        xml.WriteElementString("Last", lastname);
        xml.WriteWhitespace("\n");
        xml.WriteElementString("Organization", organization);
        xml.WriteElementString("Phone", phone);
    }

    xml.WriteEndElement();
    xml.WriteEndDocument();
}

WebClient client = new WebClient();

client.UploadFile("http://test.com/test.aspx", ms);
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 9

编辑:2013年编辑,因为当我最初回答时看起来完全错了...

选项:

  • 从中获取字节数组MemoryStream并使用UploadData

    client.UploadData("http://test.com/test.aspx", ms.ToArray());
    
    Run Code Online (Sandbox Code Playgroud)
  • OpenWrite改为使用,并写入返回的流

    using (var stream = client.OpenWrite("http://test.com/test.aspx"))
    {
        using (XmlWriter xml = XmlWriter.Create(stream, settings))
        {
            ...
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 将数据写入文件然后使用 UploadFile

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

我个人会采用前两种方法之一,以避免临时文件.


Eri*_*ips 6

按你的Invalid Arguments:

我没有在WebClient.UploadFile上看到任何方法支持MemoryStream.转换MemoryStream为a String并使用WebClient.UploadString.