Не можете найти определенные слова в контексте, отсутствует ссылка, мозг собирается взорваться? - PullRequest
1 голос
/ 05 марта 2011

Я пытаюсь изучить C # / Silverlight / Windows Phone 7. Что здесь происходит: когда я пытаюсь использовать примеры прямо с сайта MSDN MS, и я получаю всевозможные ошибки:

Дляпример:

using System;
using System.IO;
using System.Collections.Generic;
using System.Device.Location;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Tasks;
using System.Device.Location;
using Microsoft.Phone.Reactive;

  private void registerPhone(object sender, RoutedEventArgs e)
    {

        // Create a request using a URL that can receive a post. 
        WebRequest request = WebRequest.Create("http://www.contoso.com/PostAccepter.aspx ");
        // Set the Method property of the request to POST.
        request.Method = "POST";
        // Create POST data and convert it to a byte array.
        string postData = "This is a test that posts this string to a Web server.";
        byte[] byteArray = Encoding.UTF8.GetBytes(postData);
        // Set the ContentType property of the WebRequest.
        request.ContentType = "application/x-www-form-urlencoded";
        // Set the ContentLength property of the WebRequest.
        request.ContentLength = byteArray.Length;
        // Get the request stream.
        Stream dataStream = request.GetRequestStream();
        // Write the data to the request stream.
        dataStream.Write(byteArray, 0, byteArray.Length);
        // Close the Stream object.
        dataStream.Close();
        // Get the response.
        WebResponse response = request.GetResponse();
        // Display the status.
        Console.WriteLine(((HttpWebResponse)response).StatusDescription);
        // Get the stream containing content returned by the server.
        dataStream = response.GetResponseStream();
        // Open the stream using a StreamReader for easy access.
        StreamReader reader = new StreamReader(dataStream);
        // Read the content.
        string responseFromServer = reader.ReadToEnd();
        // Display the content.
        Console.WriteLine(responseFromServer);
        // Clean up the streams.
        reader.Close();
        dataStream.Close();
        response.Close();

    }

Это говорит мне

1) The name 'Encoding' does not exist in this context

2) System.Net.WebRequest does not contain a definition for GetStreamRequest and no extension method GetRequestStream accepting a first argument of type System.Net.WebRequest could be found (are you missing a using directive... etc

3) аналогичное сообщение для ContentLength

4) аналогичное сообщение для GetResponse

Я понятия не имею, какие библиотеки мне нужно «использовать», и даже когда я думаю, что «использую» нужные библиотеки, это дает мне ошибки,Что я делаю не так?

Ответы [ 3 ]

5 голосов
/ 05 марта 2011

Класс Encoding находится в пространстве имен System.Text. Вы должны добавить это к «использованию».

Что касается других сообщений, то это связано с ограничениями Silverlight. Полагаю, что образцы MSDN были взяты из "большой" версии .NET Framework, не так ли?

В Silverlight, как вы видите, некоторые вещи запрещены для предотвращения нежелательного поведения приложения (например, блокировка вызовов), а некоторые вещи не поддерживаются из-за ограничения ресурсов.

В частности, ContentLength является одним из последних. Библиотека будет определять длину контента на основе фактического объема данных, которые вы записываете в запрос. Просто удали эту строку, и все будет в порядке.

Но GetResponseStream() на самом деле один из первых. Это связано с тем, что эта операция подразумевает фактическое открытие сетевого подключения, что может занять некоторое время. А поскольку блокирование вызовов в Silverlight не разрешено, метод GetResponseStream() также должен использоваться.

Вместо этого вы должны использовать так называемый «асинхронный шаблон», то есть пару методов BeginGetResponseStream / EndGetResponseStream. Вы делаете это, вызывая метод Begin и предоставляя обратный вызов, который будет вызван после завершения операции. Затем внутри этого обратного вызова вы используете метод End, чтобы получить результат операции. Вот так:

            request.BeginGetRequestStream( ar =>
            {
                var dataStream = request.EndGetRequestStream( ar );

                // Write the data to the request stream.
                dataStream.Write( byteArray, 0, byteArray.Length );
                // Close the Stream object.
                dataStream.Close();

                // and so on...

            }, null );

То же самое относится и к методу GetResponse.

3 голосов
/ 05 марта 2011

В случае сомнений лучше всего прочитать документацию.

Например, быстрый взгляд на MSDN говорит мне, что Encoding является частью System.Text (документы здесь ).

Во-вторых, может показаться, что пример кода, который вы копируете / вставляете в свой проект, не предназначен для Windows Phone. Если вы посмотрите документы для Windows Phone WebRequest, вы заметите, что синхронные операции на телефоне не поддерживаются. Вместо этого вы должны использовать асинхронный WebRequest.BeginGetRequestStream.

Кстати, проверяя документацию MSDN, убедитесь, что вы читаете версию Silverlight (вы можете выбрать ее в верхней части страницы под заголовком статьи), и если вы работаете с Windows Phone, поищите синий значок телефона для поддерживаемых методов.

1 голос
/ 05 марта 2011

Самый простой способ устранить эти ошибки:

  • щелкните правой кнопкой мыши на оскорбительном слове - например, Кодировка - в Visual Studio
  • в контекстном меню есть опция Resolve
  • эта опция будет содержать подменю, предлагающие способы ее решения - либо с помощью «using System.Text», либо с помощью «System.Text.Encoding»

Надеюсь, это поможет.

Надеюсь, вам понравится играть с новыми инструментами - я недавно пошел другим путем, и просто требуется немного времени, чтобы привыкнуть к различным способам работы различных инструментов - дайте ему время и постарайтесь насладиться им!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...