【问题标题】:What difference is there between WebClient and HTTPWebRequest classes in .NET?.NET 中的 WebClient 和 HTTPWebRequest 类有什么区别?
【发布时间】:2011-02-14 02:16:29
【问题描述】:

.NET 中的WebClientHttpWebRequest 类之间有什么区别?他们都做非常相似的事情。事实上,为什么不将它们合并到一个类中(方法/变量等太多可能是原因之一,但 .NET 中还有其他类违反了该规则)。

谢谢。

【问题讨论】:

    标签: c# .net httpwebrequest webclient


    【解决方案1】:

    WebClient 是建立在 HttpWebRequest 之上的更高级别的抽象,用于简化最常见的任务。例如,如果您想从 HttpWebResponse 中获取内容,则必须从响应流中读取:

    var http = (HttpWebRequest)WebRequest.Create("http://example.com");
    var response = http.GetResponse();
    
    var stream = response.GetResponseStream();
    var sr = new StreamReader(stream);
    var content = sr.ReadToEnd();
    

    使用 WebClient,您只需执行 DownloadString:

    var client = new WebClient();
    var content = client.DownloadString("http://example.com");
    

    注意:为简洁起见,我在两个示例中都省略了 using 语句。您绝对应该注意正确处理您的 Web 请求对象。

    一般来说,WebClient 适用于快速而肮脏的简单请求,而 HttpWebRequest 适用于您需要对整个请求进行更多控制时。

    【讨论】:

    • 以上是事实,以下是观点:两者都很糟糕,因为 HttpWebRequest 被破坏了。它处理基本的身份验证错误,需要像ServicePointManager.Expect100Continue = false 这样的奇怪解决方法,做其他非标准的事情并且有许多怪癖和特质。我开始使用 RestSharp 来帮助解决这些问题。
    • 另请注意,WebClient 是一个组件,因此您可以将其从 VS 工具窗口拖放到您的表单中,并能够在那里使用它。
    • 任何人都像我刚才一样遇到过这种情况,请注意有一个名为HttpClient 的新玩家在.NET 4.5 中可能(或可能不会?)解决上述一些问题麻烦...
    • WebClient 实现了 IDisposable,所以你应该考虑做using (WebClient client = new WebClient())
    • @user3613932 稍微更正一下:您链接的答案提到 WebClientHttpWebRequest 作为legacy,而不是deprecated
    【解决方案2】:

    WebClient 也没有超时属性。这就是问题所在,因为默认值是 100 秒,如果没有 Internet 连接,这个值就太大了。

    该问题的解决方法在这里https://stackoverflow.com/a/3052637/1303422

    【讨论】:

    • 问题是有什么区别。区别之一是 WebClient 没有超时属性,而 HttpWebRequest 有。
    【解决方案3】:

    我知道它的回复时间太长了,但这只是为了给未来的读者提供信息:

    网络请求

    System.Object
        System.MarshalByRefObject
            System.Net.WebRequest
    

    WebRequest 是一个抽象基类。所以你实际上并不直接使用它。您可以通过它的派生类使用它 - HttpWebRequestFileWebRequest

    您使用 WebRequest 的 Create 方法来创建 WebRequest 的实例。 GetResponseStream 返回data stream

    还有FileWebRequestFtpWebRequest 类,inherit 来自WebRequest。通常,您会使用WebRequest 来发出请求并将返回转换为HttpWebRequestFileWebRequestFtpWebRequest,具体取决于您的请求。下面是一个例子:

    示例:

    var _request = (HttpWebRequest)WebRequest.Create("http://stackoverflow.com");
    var _response = (HttpWebResponse)_request.GetResponse();
    

    网络客户端

    System.Object
            System.MarshalByRefObject
                System.ComponentModel.Component
                    System.Net.WebClient
    

    WebClient 为来自URI 标识的资源中的sendingreceiving 数据提供通用操作。简单地说,它是HttpWebRequest 的更高层次的抽象。这种“通用操作”是 WebClientHttpWebRequest 的区别所在,如下面的示例所示:

    示例:

    var _client = new WebClient();
    var _stackContent = _client.DownloadString("http://stackoverflow.com");
    

    WebClient 实例下还有DownloadDataDownloadFile 操作。这些常见操作还简化了我们通常使用HttpWebRequest 执行的代码。使用HttpWebRequest,我们必须获得请求的响应,实例化StreamReader 以读取响应,最后将结果转换为我们期望的任何类型。对于WebClient,我们只需调用DownloadData, DownloadFile or DownloadString

    但是,请记住,WebClient.DownloadString 不会考虑您请求的资源的 encoding。因此,如果您不指定编码,您最终可能会收到奇怪的字符。

    注意: WebRequest 相比,基本上“WebClient 只需要几行代码”

    【讨论】:

    • WebClient 类是否使用 Post/Get 方法 ..?请提供一个链接来描述
    • WebRequest 允许我们添加请求方法类型,即带有属性 METHOD 的 Get/Post。其中 WebClient 没有任何 Method 类型添加功能。
    • @SHEKHARSHETE 我可以使用webClient.UploadData(url, "POST", bytes) 指定方法(请参阅MSDN docs)。
    猜你喜欢
    • 2011-05-26
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 2011-02-13
    • 2010-12-12
    相关资源
    最近更新 更多