Verzend XML via WebClient Post met behulp van MemoryStream

Ik probeer een XML-bestand te verzenden dat ik in mijn geheugen heb gemaakt. Het probleem komt binnen wanneer ik UploadFile probeer te gebruiken en krijg de foutmelding van ongeldige argumenten. Mijn vraag is, is er toch hoe ik mijn geheugenstroom kan gebruiken die ik heb gemaakt met WebClient.UploadFile om het bestand te verzenden of moet ik dit op een andere manier doen?

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 antwoord

EDIT: in 2013 bewerkt omdat het lijkt alsof het helemaal verkeerd was toen ik oorspronkelijk antwoordde ...

opties:

  • 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
    

Ik zou persoonlijk gaan voor een van de eerste twee benaderingen, om het tijdelijke bestand te vermijden.

9
toegevoegd
@too: Je hebt gelijk en ik weet niet zeker waarom ik de opmerking van Jim niet eerder zag. Zal bewerken.
toegevoegd de auteur Jon Skeet, de bron
@ user1040975: Zonder meer over de server te weten, is het vrijwel onmogelijk om u verder te helpen.
toegevoegd de auteur Jon Skeet, de bron
Ik begrijp gewoon niet hoe dit werkt. Waar is de overload voor UploadFile gedefinieerd waarmee iemand een stream kan gebruiken als de tweede parameter? Is het een uitbreidingsmethode?
toegevoegd de auteur Jim Counts, de bron
Ik ben het met Jim eens, de UploadData-methode heeft de vereiste handtekening, maar deze verzendt onbewerkte gegevens.
toegevoegd de auteur too, de bron
Ik heb deze methodes en anderen geprobeerd en ik krijg constant bericht van de server vertellend me zijn ongeldig type. Ik heb geprobeerd koptekst van het type inhoud toe te voegen en er treedt nog steeds een fout op.
toegevoegd de auteur user1040975, de bron
Ik heb een antwoord bijgewerkt om mijn werk te laten zien en heb een nieuwe vraag gemaakt als je het gevoel hebt dat je froggy bent. stackoverflow.com/questions/37215257/…
toegevoegd de auteur user1040975, de bron

Per uw Ongeldige argumenten :

Ik zie geen enkele methode op WebClient.UploadFile ondersteunt een MemoryStream . Converteer uw MemoryStream naar een String en gebruik WebClient.UploadString .

6
toegevoegd

Ik probeer hetzelfde te doen. Ik heb geprobeerd verschillende van de mogelijke oplossingen te gebruiken, maar zonder succes.

Wanneer ik de volgende methode probeer te gebruiken, krijgt de API het verzoek omdat de tekenreeksbestandsnaam de juiste waarde heeft, maar de inhoud van het verzoekobject is 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());
            }

mijn RESTful API MVC-controller:

 [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
toegevoegd