it-swarm.com.de

Wie schreibe ich eine HTTP-Anfrage?

Hallo, ich versuche eine HTTP-Anfrage in C # (Post) zu schreiben, aber ich brauche Hilfe bei einem Fehler

Expl: Ich möchte den Inhalt einer DLC-Datei an den Server senden und den entschlüsselten Inhalt erhalten.

C # -Code

public static void decryptContainer(string dlc_content) 
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://dcrypt.it/decrypt/paste");
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.Accept = "Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";

    using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII))
    {
        writer.Write("content=" + dlc_content);
    }

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
    {
        Console.WriteLine(reader.ReadToEnd());
    }
}

und hier bekam ich die HTML-Anfrage

<form action="/decrypt/paste" method="post">
    <fieldset>
        <p class="formrow">
          <label for="content">DLC content</label>
          <input id="content" name="content" type="text" value="" />
         </p>
        <p class="buttonrow"><button type="submit">Submit »</button></p>
    </fieldset>
</form>

Fehlermeldung:

{
    "form_errors": {
      "__all__": [
        "Sorry, an error occurred while processing the container."
       ]
    }
}

Wäre sehr hilfreich, wenn mir jemand helfen könnte, das Problem zu lösen!

13
Googles

Sie haben keine Inhaltslänge festgelegt, was Probleme verursachen kann. Sie können auch versuchen, Bytes direkt in den Stream zu schreiben, anstatt sie zuerst in ASCII zu konvertieren.

public static void decryptContainer(string dlc_content) 
   {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://dcrypt.it/decrypt/paste");
        request.Method = "POST";
        request.ContentType = "application/x-www-form-urlencoded";
        request.Accept = "Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";

        byte[] _byteVersion = Encoding.ASCII.GetBytes(string.Concat("content=", dlc_content));

        request.ContentLength = _byteVersion.Length

        Stream stream = request.GetRequestStream();
        stream.Write(_byteVersion, 0, _byteVersion.Length);
        stream.Close();

        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        using (StreamReader reader = new StreamReader(response.GetResponseStream()))
        {
            Console.WriteLine(reader.ReadToEnd());
        }
    }

Ich habe persönlich festgestellt, dass ein solches Posting in der Vergangenheit etwas "fidgity" ist. Sie können auch versuchen, die ProtocolVersion für die Anforderung festzulegen.

13
chemicalNova

Ich würde Ihren Code so vereinfachen:

public static void decryptContainer(string dlc_content) 
{
    using (var client = new WebClient())
    {
        var values = new NameValueCollection
        {
            { "content", dlc_content }
        };
        client.Headers[HttpRequestHeader.Accept] = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
        string url = "http://dcrypt.it/decrypt/paste";
        byte[] result = client.UploadValues(url, values);
        Console.WriteLine(Encoding.UTF8.GetString(result));
    }
}

Es stellt außerdem sicher, dass die Anforderungsparameter ordnungsgemäß codiert sind.

6
Darin Dimitrov
public string void decryptContainer(string dlc_content) //why not return a string, let caller decide what to do with it.
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://dcrypt.it/decrypt/paste");
    request.Method = "POST";
    request.ContentType = "application/x-www-form-urlencoded";
    request.Accept = "Accept=text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";//sure this is needed? Maybe just match the one content-type you expect.
    using (StreamWriter writer = new StreamWriter(request.GetRequestStream(), Encoding.ASCII))
    {
        writer.Write("content=" + Uri.EscapeDataString(dlc_content));//escape the value of dlc_content so that the entity sent is valid application/x-www-form-urlencoded
    }
    using(HttpWebResponse response = (HttpWebResponse)request.GetResponse())//this should be disposed when finished with.
    using (StreamReader reader = new StreamReader(response.GetResponseStream()))
    {
        return reader.ReadToEnd();
    }
}

Es könnte immer noch ein Problem mit dem sein, was tatsächlich gesendet wird.

2
Jon Hanna

request.ContentLength sollte ebenfalls gesetzt werden.

Gibt es auch einen Grund, warum Sie ASCII im Vergleich zu UTF8 kodieren?

1
digitalmarks

Ein Problem, das ich sofort sehe, ist, dass Sie den Wert des Parameters content für die URL kodieren müssen. Verwenden Sie HttpUtility.UrlEncode() für das . Abgesehen davon gibt es möglicherweise andere Probleme, aber es ist schwer zu sagen, nicht zu wissen, was der Dienst tut. Der Fehler ist zu allgemein und könnte etwas bedeuten

1
Ilia G

Da kann ich die Lösung von Jon Hanna nicht kommentieren. Dies hat es für mich gelöst: Uri.EscapeDataString

        // this is what we are sending
        string post_data = "content=" + Uri.EscapeDataString(dlc_content);

        // this is where we will send it
        string uri = "http://dcrypt.it/decrypt/paste";

        // create a request
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
        request.KeepAlive = false;
        request.ProtocolVersion = HttpVersion.Version10;
        request.Method = "POST";

        // turn our request string into a byte stream
        byte[] postBytes = Encoding.ASCII.GetBytes(post_data);

        // this is important - make sure you specify type this way
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = postBytes.Length;

        Stream requestStream = request.GetRequestStream();

        // now send it
        requestStream.Write(postBytes, 0, postBytes.Length);
        requestStream.Close();

        // grab te response and print it out to the console along with the status code
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        Console.WriteLine(new StreamReader(response.GetResponseStream()).ReadToEnd());
        Console.WriteLine(response.StatusCode);
0
Luca Salzani

Holen Sie sich zuerst den mit der Antwort verknüpften Stream und übergeben Sie diesen wie folgt in den Streamreader:

    Stream receiveStream = response.GetResponseStream();       

    using (StreamReader reader = new StreamReader(receiveStream, Encoding.ASCII))
    {
        Console.WriteLine(reader.ReadToEnd());
    }
0
Standage