Как вызвать службы REST из переносной библиотеки классов?

мои целевые проекты-Windows 8, WinRT и Windows Phone 8. Я использую переносимые библиотеки классов для решения, чтобы поделиться источниками. Мне нужно вызвать некоторые службы REST, созданные в другом проекте MVC Web Api, но HttpClient класс недоступен в PCL. Какой подход был бы хорошим для ее решения? Я думал в интерфейсе сервиса, а затем создать проект для каждой платформы, используя HttpClient, WebClient или соответствующий класс в каждом случае. Такой подход может сработать но мне интересно, есть ли другие способы.

4 ответов


HttpClient не обязательно переносится с точки зрения Microsoft. Единственный другой способ-создать отдельные библиотеки, которые будет реализовывать каждый проект, и делать так, как вы описали. Таким образом, вы можете достичь общности на всех платформах, на которые вы хотите нацелиться.

Я думал, что есть некоторый уровень эквивалентности, когда дело доходит до платформ, на которые вы нацелены... Если вам нужны отдельные проекты, вы можете связать свои файлы кода с другим проектом, чтобы у вас не было поддерживать несколько проектов, или даже использовать Компоновщик Проекта (хотя я не знаю, существует ли версия 2012).


компания Microsoft переписал HttpClient библиотека должна быть портативной (PCL) и здесь на NuGet. в настоящее время он доступен только как предварительный выпуск, поэтому, если вы используете диспетчер пакетов NuGet GUI, убедитесь, что вы установили "включить предварительный выпуск". из командной строки:

Install-Package Microsoft.Net.Http

Portable REST недавно стал доступен на GitHub и должен помочь сделать веб-запросы, учитывая, что WebClient недоступен:

https://github.com/advancedrei/PortableRest#readme

PortableRest-это портативная библиотека классов для реализации REST API клиенты в других переносимых библиотеках классов. Он использует JSON.NET для быстрая, настраиваемая сериализация, а также Microsoft.Bcl.Асинхронный библиотека для ожидаемого выполнения на любая платформа. Он предназначен, чтобы быть в значительной степени drop-in совместим с RestSharp, хотя вам нужно будет внести изменения и перекомпилировать.

этот первоначальный выпуск имеет ограниченную поддержку простых запросов JSON. Больше вариантов (включая XML и, надеюсь, поддержку DataContract) будет будет доступен в более поздних версиях.


довольно поздно, но вот простой код, который я должен был сделать, PLC предназначен для всего, кроме XBox 360 ( может работать тоже ). Я не мог использовать HttpClient для этого целевого списка.

public class WebDownload
{
    public class WebDownloadResult
    {
        public HttpStatusCode StatusCode { get; set; }
        public int StatusCodeNumber { get; set; }
        public bool ErrorOccured { get; set; }
        public string ResultString { get; set; }
    }

    public static void Download(string url, Action<WebDownloadResult> resultAction)
    {
        WebDownloadResult response = new WebDownloadResult();
        try
        {
            HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(url);

            IAsyncResult result = (IAsyncResult)myHttpWebRequest.BeginGetResponse(new AsyncCallback(delegate(IAsyncResult tempResult)
            {
                HttpWebResponse webResponse = (HttpWebResponse)myHttpWebRequest.EndGetResponse(tempResult);
                Stream responseStream = webResponse.GetResponseStream();

                using (StreamReader reader = new StreamReader(responseStream, Encoding.UTF8))
                {
                    response.ResultString = reader.ReadToEnd();
                    response.StatusCode = webResponse.StatusCode;
                    response.StatusCodeNumber = (int)webResponse.StatusCode;

                    if (resultAction != null) resultAction(response);
                }
            }), null);
        }
        catch 
        {
            response.ErrorOccured = true;
            if (resultAction != null) resultAction(response);
        }
    }
}