Статьи

Windows Phone 7 и выполнение вызовов HTTPS REST API с базовой аутентификацией


В последнее время я был занят реализацией REST API в Microsoft Azure с использованием Windows Azure с WCF 4 и механизмами маршрутизации.
Причина выбора реализации REST заключается в совместимости между несколькими платформами, которые мы должны поддерживать (iPhone и Android). Вот некоторые из причин, почему из нашего опыта:

 

  1. Хотя в iPhone и Android есть сторонние компоненты для поддержки основного http мыла, мы обнаружили, что проще использовать REST API.
  2. Работа с HTTPS + Basic Http + WCF не была дружественной к разработчикам, когда речь шла о разработке против нее. Например, если вы внедряете пользовательскую аутентификацию, вы должны реализовать ее в безопасном транспортном протоколе HTTPS по имени пользователя, но во многих случаях среда разработки на самом деле не настроена на выполнение HTTPS. Вы можете использовать самозаверяющие сертификаты, но вы быстро обнаружите, что в Silverlight вы получите сообщение об ошибке «Не найдена конечная точка». Это потому, что ваш код должен проверять недоверенный сертификат. Хороший пример этого — когда вы пытаетесь подключиться с помощью IE к самозаверяющему HTTPS-сайту, и он запрашивает, хотите ли вы продолжить. То же самое происходит в вашем коде, который вы должны обработать, и, к сожалению, я обнаружил, что в Windows Phone 7 Silverlight это не поддерживается и делает невозможным работу с самозаверяющим сертификатом.Но с REST вы просто используете HTTP, а когда вы работаете, вы переключаете конечную точку на HTTPS без каких-либо дополнительных усилий. Если вы не используете Windows Phone 7, вы можете использовать самоподписанный сертификат, используя следующий код:
  3. public static void SetCertificatePolicy()
    
    {
    
        ServicePointManager.ServerCertificateValidationCallback +=
    
        RemoteCertificateValidate;
    
    }
    
     
    
    private static bool RemoteCertificateValidate(object sender,
    
        X509Certificate cert, X509Chain chain, SslPolicyErrors error)
    
    {
    
        // trust any certificate!!!
    
        return true;
    
    }
    
  4. Если бы мы когда-либо представляли наши конечные точки для общего пользования, я думаю, что это упрощает использование REST API, поскольку наши методы не очень сложны.
  5. Заголовки SOAP не требуют дополнительных затрат — нам нужно сделать его идеальным для Azure, поскольку вы платите за пропускную способность.

В следующем разделе вы узнаете, как выполнять вызовы REST API в Silverlight.

Как сделать вызов REST API в Windows Phone 7?

Вы можете использовать HttpWebRequest и HttpWebResponse, но я обнаружил, что гораздо проще использовать WebClient. Вот пример вызова REST POST.

string url = “http://some url”;

 

WebClient req = new WebClient();

req.Credentials = new NetworkCredential(UserName, Password);

req.Headers["Content-type"] = “text/xml”;

req.UploadStringCompleted += (s, e) =>

{

    if (e.Error == null)

    {

        // Do Something with e.Result

    }

};

 

req.UploadStringAsync(new Uri(url), “POST”

    , DtoSerializer.GetString<MyDto>(myDto)); 

В приведенном выше коде есть пара вещей, которые нужно отметить. Учетные данные, которые вы можете использовать NetworkCredential для прохождения базовой аутентификации и установки Content-type на text / xml для публикации XML. Чтобы опубликовать xml, вам нужно будет сериализовать ваш объект с помощью DataContractSerializer, как показано в коде ниже:

использование System.Xml;

использование System.IO;

использование System.Runtime.Serialization;

используя Систему;

использование System.Text;

 

Пространство имен Common

{

    публичный класс DtoSerializer

    {

        public static T GetObject <T> ( строка xml)

        {

            if ( string .IsNullOrEmpty (xml))

            {

                бросить новое ArgumentNullException ( «xml» );

            }

            DataContractSerializer ser = новый DataContractSerializer ( typeof (T));

            return (T) ser.ReadObject ( XmlReader .Create ( new StringReader (xml)));

        }

 

        открытый статический байт [] GetBytes <T> (T obj)

        {

            если (obj == ноль )

            {

                бросить новое ArgumentNullException ( «объект» );

            }

 

            DataContractSerializer ser = новый DataContractSerializer ( typeof (T));

            использование ( MemoryStream msSerialized = new MemoryStream ())

            {

                ser.WriteObject (msSerialized, obj);

                msSerialized.Flush ();

                byte [] byteSerialized = msSerialized.ToArray ();

                вернуть byteSerialized;

            }

        }

 

        открытая статическая строка GetString <T> (T obj)

        {

            byte [] array = GetBytes <T> (obj);

            return Encoding .UTF8.GetString (array, 0, array.Length);

 

        }

    }

}

Вы также можете использовать приведенный выше код для десериализации XML, который вы получаете из вызовов REST, как показано в коде ниже:

string url = “https://your REST url”;

 

WebClient req = new WebClient();

req.Credentials = new NetworkCredential(UserName, Password);

req.DownloadStringCompleted += (s, e) =>

    {

        if (e.Error == null)

        {

            if (!string.IsNullOrEmpty(e.Result))

            {

                this.CurrentMyDto = DtoSerializer.GetObject<myDto>(e.Result);

            }

        }

    };

req.DownloadStringAsync(new Uri(url));

 

Вывод

В этом блоге вы узнали о том, как выполнять вызовы REST API из приложения Windows Phone 7 с базовой аутентификацией.