2011-10-27 83 views
2

我試圖發送一個在我的記憶流中創建的XML文件。當我嘗試使用UploadFile並獲取無效參數錯誤時,問題就出現了。我的問題是,反正是有,我可以用我的MemoryStream,我與WebClient.UploadFile創建要發送的文件或我需要這個做一些其他的方式?使用MemoryStream通過WebClient發送XML

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); 

回答

9

編輯:在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 
    

我會親自去爲前兩種方法中的一種,避免臨時文件。

+0

我只是不明白這是如何工作的。定義的'UploadFile'重載在哪裏允許將一個流用作第二個參數?它是一種擴展方法嗎? –

+0

我同意Jim的觀點,UploadData方法具有所需的簽名,但它發送原始數據。 – too

+0

@too:你是對的,我不確定爲什麼我以前沒有看到Jim的評論。將編輯。 –

0

我試圖做同樣的。我嘗試過使用幾種可能的解決方案,但沒有成功。

當我嘗試使用下面的方法的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); 
     } 
}