MemoryStreamを使用してWebClient Post経由でXMLを送信する

私はmemorystreamで作成したXMLファイルを送信しようとしています。 UploadFile を使用して無効な引数のエラーを取得しようとすると、この問題が発生します。私の質問は、ファイルを送信するために私が WebClient.UploadFile で作成した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);
2

3 答え

編集:それは私が元々答えたときにそれが完全に間違っていたように見えるので、2013年に編集...

オプション:

  • Take the byte array from the MemoryStream and use UploadData

    client.UploadData("http://test.com/test.aspx", ms.ToArray());
    
  • Use OpenWrite instead, and write to the stream returned

    using (var stream = client.OpenWrite("http://test.com/test.aspx"))
    {
        using (XmlWriter xml = XmlWriter.Create(stream, settings))
        {
            ...
        }
    }
    
  • Write the data to a file and then use UploadFile

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

一時的なファイルを避けるため、私は最初の2つのアプローチの1つに個人的に行きます。

9
追加された
@too:あなたは正しい。なぜ私は前にJimのコメントを見なかったのか分からない。編集します。
追加された 著者 Jon Skeet,
@ user1040975:サーバーの詳細がわからないと、さらに手伝うことはほとんど不可能です。
追加された 著者 Jon Skeet,
私はちょうどこれがどのように動作するのか分かりません。ストリームを第2のパラメータとして使用できるように定義されている UploadFile オーバーロードはどこにありますか?それは拡張メソッドですか?
追加された 著者 Jim Counts,
私はJimに同意します、UploadDataメソッドは必要な署名を持っていますが、生データを送信します。
追加された 著者 too,
私はこれらのメソッドや他のメソッドを試してみたが、私は一貫してサーバーからメッセージを受け取り、無効な型を教えてくれた。コンテンツタイプヘッダーを追加しようとしましたが、まだエラーが発生しています。
追加された 著者 user1040975,
私は自分の仕事を表示するための答えを更新し、あなたが蛙を感じている場合は新しい質問を作成しました。 stackoverflow.com/questions/37215257/…
追加された 著者 user1040975,
6
追加された

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

次のメソッドを使用しようとすると、apiは文字列filenameが正しい値を持つためリクエストを取得しますが、リクエストオブジェクトの内容はnullです...

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);
        }
}
0
追加された