4 Stimmen

System.Net.WebClient wirft keinen Fehler während des Uploads von UploadString zu ungültiger URL?

Bei diesem Code habe ich erwartet, dass eine Ausnahme auftritt, aber System.Net.WebClient.UploadString liefert einen leeren String in result zurück.

Offensichtlich übersehe ich etwas, aber was?

using System.Net;
using System.Text;

[TestClass()]
public class WebClientTests
{
    [TestMethod()]
    public void WebClientUploadStringToInvalidUrlTest()
    {
        var webClient = new WebClient { Encoding = Encoding.UTF8 };
        var result =  webClient.UploadString("{{foo-bar}}", "snafu");
        Assert.IsTrue(string.IsNullOrEmpty(result));
    }

    [TestMethod()]
    [ExpectedException(typeof(ArgumentNullException))]
    public void WebClientUploadStringToNullUrlTest()
    {
        var webClient = new WebClient { Encoding = Encoding.UTF8 };
        string url = null;
        var result = webClient.UploadString(url, "snafu");
        Assert.IsTrue(string.IsNullOrEmpty(result));
    }

}

Bearbeitung: Wie vorgeschlagen von hanno habe ich auch einen null Test hinzugefügt, und dieser wirft eine ArgumentNullException aus, was ich irgendwie erwartet hatte.

3voto

rene Punkte 39585

Es ist nur möglich, dies zu beantworten, indem man interne Implementierungsdetails betrachtet.

Zur Vorbereitung versucht die WebClient-Klasse, aus dem von Ihnen in diesem Überlastungsfall für UploadString bereitgestellten String eine echte Uri zu erstellen.

Der Code sieht ungefähr so im 4.0-Framework aus:

 if (!Uri.TryCreate(path, UriKind.Absolute, out address))
 {
      return new Uri(Path.GetFullPath(path));
 } 

Das TryCreate gibt false für Ihren nicht URI-konformen Pfad zurück, sodass es dazu übergeht, eine Uri für den Path.GetFullPath Ihres Strings zu erstellen, der eine Uri mit einem file://-Schema zurückgibt.

Intern verwendet der WebClient WebRequest.Create, um ein WebRequest zu erhalten, das in der Lage ist, das gegebene Schema zu verarbeiten. In Ihrem Fall wird ein FileWebRequest zurückgegeben (aufgrund des Schemas file://)

Wenn man alle Überprüfungen und internen Verdrahtungen entfernt, wird die folgende vereinfachte Aufrufsequenz nach Erhalt der Uri ausgeführt:

        var fwr = (FileWebRequest) WebRequest.Create(new Uri(Path.GetFullPath(path)));
        fwr.Method ="POST";
        var us = fwr.GetRequestStream();
        var upload = Encoding.UTF8.GetBytes("snafu");
        us.Write(upload,0,upload.Length);
        us.Close();
        var sr = new StreamReader(fwr.GetResponse().GetResponseStream());
        return sr.ReadToEnd();

Das wirft keine Ausnahme und gibt einen leeren String zurück.

Ihre Annahme "Ich erwarte, dass dies eine Ausnahme auslöst" ist falsch.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X