2011-10-27 24 views
2

memorystreamで作成したXMLファイルを送信しようとしています。問題は、UploadFileを使用して、無効な引数のエラーを取得しようとしたときに発生します。私の質問は、とにかく私がWebClient.UploadFileで作成した私のmemorystreamを使ってファイルを送ることができるか、それとも何か別のやり方をする必要があるのでしょうか?WebClient経由でXMLを送信するMemoryStreamを使用して投稿

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 
    

を使用し返され、私は個人的には、最初の2つのアプローチの1のために行くだろう一時ファイルを避ける。あなたのInvalid Argumentsパー

+0

これはまったくどのように動作するのか分かりません。第2のパラメータとしてストリームを使用できるようにする 'UploadFile'オーバーロードはどこに定義されていますか?それは拡張メソッドですか? –

+0

私はJimに同意します、UploadDataメソッドは必要な署名を持っていますが、生データを送信します。 – too

+0

@too:あなたはそうだ、と私はなぜ前にジムのコメントが見えなかったのか分からない。編集します。 –

6

:私はWebClient.UploadFile上の任意のメソッドが表示されていない

MemoryStreamサポートしています。 MemoryStreamStringに変換し、WebClient.UploadStringを使用してください。

0

私は同じことをしようとしています。私は可能な解決策のいくつかを使ってみましたが、成功しませんでした。

私は、文字列のファイル名が正しい値を持っていますが、リクエストオブジェクトの内容がnullであるとして、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); 
     } 
} 
関連する問題