我可以使用什么而不是"使用" C#中的陈述

时间:2016-06-23 13:45:25

标签: c# using

我无法让代码工作。我需要访问一个只有一行文本的网站,并在cmd提示符下显示它。该网站受密码保护,所以我使用webClient存储cookie,并试图找出如何给它的用户名和密码。 "使用"声明不起作用,有人知道我可以尝试什么吗?

using System;
using System.Net;

namespace Temperature
{
    public class CookieAwareWebClient : WebClient
    {
        public CookieContainer m_container = new CookieContainer();

        protected override WebRequest GetWebRequest(Uri address)
        {
            WebRequest request = base.GetWebRequest(address);
            if (request is HttpWebRequest)
            {
                (request as HttpWebRequest).CookieContainer = m_container;
        }
        return request;
        }   

        using (var client = new CookieAwareWebClient());
        var values = new NameValueCollection
        {
            {"username", "admin"},
            {"password","secret"},
        };
    client.UpLoadValues("http://10.10.1.52:8001/get?OID4.3.2.1=", values);

    string tempString = client.DownloadString("http://10.10.1.52:8001/get?OID4.3.2.1=");
    Stream response = myClient.OpenRead("http://10.10.1.52:8001/get?OID4.3.2.1=");
    Console.WriteLine(tempString);
    }
}

3 个答案:

答案 0 :(得分:9)

您没有正确使用using块。这样:

using (var client = new CookieAwareWebClient());

与此基本相同:

using (var client = new CookieAwareWebClient())
{
}

您创建变量,但在代码块中不对其执行任何操作。所以它立即超出了范围。

将代码移动到该代码块中以使用您创建的变量:

using (var client = new CookieAwareWebClient())
{
    var values = new NameValueCollection
    {
        {"username", "admin"},
        {"password","secret"},
    };
    client.UpLoadValues("http://10.10.1.52:8001/get?OID4.3.2.1=", values);
    string tempString = client.DownloadString("http://10.10.1.52:8001/get?OID4.3.2.1=");
    // etc.
}

除了理解using块真正做什么之外,它在逻辑上等同于:

try
{
    var client = new CookieAwareWebClient();

    // any code you add to the block
}
finally
{
    client.Dispose();
}

与任何try块一样,任何使用该块中声明的变量的代码也需要在该块内。

答案 1 :(得分:0)

您已使用using (var client ...)终止了;,因此无法再访问client。因此,您需要做的是将其余代码括在using block

using (var client = new CookieAwareWebClient())
{
    var values = new NameValueCollection
    {
        {"username", "admin"},
        {"password","secret"},
    };
    client.UpLoadValues("http://10.10.1.52:8001/get?OID4.3.2.1=", values);
    string tempString = client.DownloadString("http://10.10.1.52:8001/get?OID4.3.2.1=");
    Stream response = myClient.OpenRead("http://10.10.1.52:8001/get?OID4.3.2.1=");
    Console.WriteLine(tempString);
}

注意:我对myClient有点困惑的是在using block之外声明的拼写错误或任何目的的完整变量。

答案 2 :(得分:0)

你应该使用这样的:

    using (var client = new CookieAwareWebClient())
{
        var values = new NameValueCollection
        {
            {"username", "admin"},
            {"password","secret"},
        };
       client.UpLoadValues("http://10.10.1.52:8001/get?OID4.3.2.1=", values);

       string tempString = client.DownloadS`enter code here`tring("http://10.10.1.52:8001/get?OID4.3.2.1=");
        Stream response = myClient.OpenRead("http://10.10.1.52:8001/get?OID4.3.2.1=");
}

因为在启动和处理时使用创建“客户端”,然后完成使用块。