System.Net.WebClient在UploadString期间没有将错误丢失到无效的url?

时间:2014-06-06 13:11:55

标签: c# .net webclient

鉴于此代码,我预计会发生异常,但System.Net.WebClient.UploadString会将空字符串返回result

我显然忽略了什么,但是什么?

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));
    }

}

编辑per suggestion hanno同时添加了null测试,这会产生ArgumentNullException,这是我所期待的。

1 个答案:

答案 0 :(得分:2)

只有通过查看内部实施细节才能回答这个问题。

在准备过程中,WebClient类会尝试从您在重载中提供的字符串Uri中构建一个真实的UploadString

代码大致在4.0框架中如下所示:

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

TryCreate为您的非false符合条件路径返回URI,因此它会回退为您的字符串的Path.GetFullPath创建Uri,返回一个Uri file:// scheme

WebClient内部使用WebRequest.Create获取能够处理给定WebRequestscheme。在您的情况下,将返回FileWebRequest(由于该方案为file://

剥离所有检查和内部管道,在获得Uri后执行以下简化的调用序列:

        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();

不会抛出异常并返回空字符串。

您的假设"我希望这会引发异常" 是错误的。

相关问题