Как вызвать службы 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);
}
}
}