Действительно ли WebClient недоступен для .NET 3.5 CF?

Мое приложение нацелено на Windows CE; он использует компактную структуру

Я скопировал некоторый работающий в другом месте код, который использует WebClient, но он не компилируется, говоря: «Не удалось найти имя типа или пространства имен «WebClient» (вы пропустили директиву using или ссылку на сборку?) "

У меня есть «использование System.Net»;

Из-за этой ошибки я также получаю сообщение "Имя HttpRequestHeader не существует в текущем контексте"

Код:

private static void SendXMLFile(string xmlFilepath, string uri)
{
    using (var client = new WebClient())
    {
        client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
        StringBuilder sb = new StringBuilder();
        using (StreamReader sr = new StreamReader(xmlFilepath))
        {
            String line;
            while ((line = sr.ReadLine()) != null)
            {
                sb.AppendLine(line);
            }
        }
        // I don't know why the prepended equals sign is necessary, but it is
        string allLines = "=" + sb.ToString();
        var result = client.UploadString(uri, "POST", allLines);
    }
}

Если WebClient доступен для моего сценария, какая ссылка/использование мне нужна?

Если WebClient недоступен для моего сценария, какой существует выход/замена?

Если нет помощи/замены, кто может/пришлет мне бутылку Blackberry Brandy?

ОБНОВИТЬ

Я пытаюсь адаптировать ответ к своей ситуации, но сразу же сталкиваюсь с проблемой:

HttpWebRequest request = (HttpWebRequest) WebRequest.Create(uri);
request.Method = method;

Проблема в том, что "метод" не распознается (получает случай с красными волнистыми линиями и "Имя "метод" не существует в текущем контексте"

ОБНОВЛЕНИЕ 2

Я вижу - метод - это переданная строка; что мне нужно:

request.Method = "POST";

ОБНОВЛЕНИЕ 3

Я еще не уверен, что это действительно сработает, но оно компилируется и, кажется, имеет смысл, поэтому я попробую:

private static string SendXMLFile(string xmlFilepath, string uri, int timeout)
{
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
    request.KeepAlive = false;
    request.ProtocolVersion = HttpVersion.Version10;
    request.Method = "POST";

    StringBuilder sb = new StringBuilder();
    using (StreamReader sr = new StreamReader(xmlFilepath))
    {
        String line;
        while ((line = sr.ReadLine()) != null)
        {
            sb.AppendLine(line);
        }
        byte[] postBytes = Encoding.UTF8.GetBytes(sb.ToString());
        if (timeout < 0)
        {
            request.ReadWriteTimeout = timeout;
            request.Timeout = timeout;
        }

        request.ContentLength = postBytes.Length;
        request.KeepAlive = false;

        request.ContentType = "application/x-www-form-urlencoded";

        try
        {
            Stream requestStream = request.GetRequestStream();

            requestStream.Write(postBytes, 0, postBytes.Length);
            requestStream.Close();

            using (var response = (HttpWebResponse)request.GetResponse())
            {
                return response.ToString();
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            request.Abort();
            return string.Empty;
        }
    }
}

person B. Clay Shannon    schedule 01.03.2014    source источник


Ответы (1)


WebClient не существует, хотя на самом деле это не так уж и важно. Вы можете обойтись с помощью HttpWebRequest практически для всего, что вы будете делать.

Что-то в этом роде (из расширений OpenNETCF):

private string SendData(string method, string directory, string data, string contentType, int timeout)
{
    lock (m_syncRoot)
    {
        directory = directory.Replace('\\', '/');
        if (!directory.StartsWith("/"))
        {
            directory = "/" + directory;
        }

        string page = string.Format("{0}{1}", DeviceAddress, directory);

        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(page);
#if !WINDOWS_PHONE
        request.KeepAlive = false;
        request.ProtocolVersion = HttpVersion.Version10;
#endif
        request.Method = method;

        // turn our request string into a byte stream
        byte[] postBytes;

        if (data != null)
        {
            postBytes = Encoding.UTF8.GetBytes(data);
        }
        else
        {
            postBytes = new byte[0];
        }

#if !WINDOWS_PHONE
        if (timeout < 0)
        {
            request.ReadWriteTimeout = timeout;
            request.Timeout = timeout;
        }

        request.ContentLength = postBytes.Length;
        request.KeepAlive = false;
#endif
        if (contentType.IsNullOrEmpty())
        {
            request.ContentType = "application/x-www-form-urlencoded";
        }
        else
        {
            request.ContentType = contentType;
        }

        try
        {
            Stream requestStream = request.GetRequestStream();

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


            using (var response = (HttpWebResponse)request.GetResponse())
            {
                return GetResponseString(response);
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine(ex.Message);
            request.Abort();
            return string.Empty;
        }
    }
}
person ctacke    schedule 01.03.2014
comment
Спасибо; что мне нужно сделать, так это отправить данные с карманного компьютера на сервер (приложение веб-API), используя метод RESTful. - person B. Clay Shannon; 03.03.2014
comment
Да, описанный выше метод — это тот, который я использую специально для этого. Например, POST выглядит так: SendData("POST", "/svcpath", data, "text/xml", 5000); - person ctacke; 03.03.2014
comment
DeviceAddress на самом деле не устройство, а целевая служба REST (которая в моем случае работает на том, что мы называем устройством, а не сервером, хотя предпосылка та же) - person ctacke; 03.03.2014
comment
О, ладно, да, этот DeviceAddress поставил меня в тупик (не цикл программирования, а скорее фруктовый цикл). - person B. Clay Shannon; 03.03.2014