RFC на HttpWebRequest против RESTSharp из Windows CE / Compact Framework 3.5

Я создал простой сервис WebAPI в.NET4 и Visual Studio 2010.

Мне нужно использовать этот сервис в приложении Windows CE / CF 3.5

У меня действительно есть HttpWebRequest, но я не уверен, стоит ли идти этим путем, или я должен использовать RestSharp. У кого-нибудь есть понимание / опыт, который помог бы мне решить? Я предпочитаю не использовать сторонний код, когда это возможно, чтобы избежать его, но я готов сделать это, если есть явное преимущество перед "необработанными" предложениями.

У кого-нибудь есть или известны примеры доступа к сервисам WebApi с использованием HttpWebRequest ИЛИ RestSharp из CF 3.5?

У меня есть этот код (адаптированный с http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-api) для примеров методов WebAPI:

public class VendorItemsController : ApiController
{
    VendorItem[] vendorItems = new VendorItem[] 
    {   
        new VendorItem { VendorId = "1", VendorItemId = "Tomato Soup", ItemId = "Groceries", PackSize = 1 }, 
        new VendorItem { VendorId = "2", VendorItemId = "V8", ItemId = "Groceries", PackSize = 6 }, 
        new VendorItem { VendorId = "3", VendorItemId = "Garlic", ItemId = "Groceries", PackSize = 1 }, 
    };

    public IEnumerable<VendorItem> GetAllProducts()
    {
        return vendorItems;
    }

    public VendorItem GetProductById(string id)
    {
        var vendorItem = vendorItems.FirstOrDefault((p) => p.VendorId == id);
        if (vendorItem == null)
        {
            throw new HttpResponseException(HttpStatusCode.NotFound);
        }
        return vendorItem;
    }
}

... но не знаю, как использовать это, используя, если возможно, HttpWebRequest.

Примечание: HttpClient мне недоступен (хотя HttpWebRequest есть).

ОБНОВИТЬ

Я запускаю приложение VS2010, которое имеет метод WebAPI; но когда я запускаю приложение VS2008 Windows CE / Compact Framekwork 3.5 с этим кодом:

Uri _baseAddress = new Uri("http://localhost:48614/");
string localFile = "fetchedVendorItems.txt";
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(_baseAddress + "api/vendoritems/");
req.Method = "GET";
HttpWebResponse resp = (HttpWebResponse) req.GetResponse();

// Retrieve response stream and wrap in StreamReader
Stream respStream = resp.GetResponseStream();
StreamReader rdr = new StreamReader(respStream);

// Create the local file
StreamWriter wrtr = new StreamWriter(localFile);

// loop through response stream reading each line and writing to the local file
string inLine = rdr.ReadLine();
while (inLine != null)
{
    wrtr.WriteLine(inLine);
    inLine = rdr.ReadLine();
}

rdr.Close();
wrtr.Close();

(который я адаптировал отсюда: http://msdn.microsoft.com/en-us/library/aa446517.aspx)

... я получаю "Невозможно подключиться к удаленному серверу"

ОБНОВЛЕНИЕ 2

Это работает прямо в браузере на компьютере разработчика:

http://localhost:48614/api/redemptions/

Он возвращает эти значения из контроллера:

readonly Redemption[] redemptions =
{   
    new Redemption { RedemptionId = "1", RedemptionName = "Old", RedemptionItemId = "ABC", RedemptionAmount = 0.25M, RedemptionDept = "2.0", RedemptionSubDept = "42" }, 
    new Redemption { RedemptionId = "2", RedemptionName = "Damaged", RedemptionItemId = "BCD", RedemptionAmount = 5.00M, RedemptionDept = "42.0", RedemptionSubDept = "76" }, 
    new Redemption { RedemptionId = "3", RedemptionName = "Rebate", RedemptionItemId = "DEF", RedemptionAmount = 42.75M, RedemptionDept = "76.0", RedemptionSubDept = "112" }
};

...вот так:

<ArrayOfRedemption xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/HHSServerWebAPI.Models">
<Redemption>
<RedemptionAmount>0.25</RedemptionAmount>
<RedemptionDept>2.0</RedemptionDept>
<RedemptionId>1</RedemptionId>
<RedemptionItemId>ABC</RedemptionItemId>
<RedemptionName>Old</RedemptionName>
<RedemptionSubDept>42</RedemptionSubDept>
</Redemption>
<Redemption>
<RedemptionAmount>5.00</RedemptionAmount>
<RedemptionDept>42.0</RedemptionDept>
<RedemptionId>2</RedemptionId>
<RedemptionItemId>BCD</RedemptionItemId>
<RedemptionName>Damaged</RedemptionName>
<RedemptionSubDept>76</RedemptionSubDept>
</Redemption>
<Redemption>
<RedemptionAmount>42.75</RedemptionAmount>
<RedemptionDept>76.0</RedemptionDept>
<RedemptionId>3</RedemptionId>
<RedemptionItemId>DEF</RedemptionItemId>
<RedemptionName>Rebate</RedemptionName>
<RedemptionSubDept>112</RedemptionSubDept>
</Redemption>
</ArrayOfRedemption>

... даже когда проект VS2008 не запущен - это потому, что эти данные были кэшированы (когда я впервые вошел:

http://localhost:48614/api/redemptions/

... в браузере запущено приложение Web API)?

Я понял, что эмулятор не распознает "localhost" как экземпляр рабочего стола, считая себя кем-то / где-то еще. Так как я могу проверить это на эмуляторе? Какой IP-адрес я могу использовать?

1 ответ

Решение

Уклоняться от стороннего кода просто глупо. Зачем изобретать велосипед? Если вы являетесь компанией, которая по IP делает REST-вызовы, то, конечно, откатите ее, но я подозреваю, что ваше основное бизнес-предложение заключается в решении какой-то другой проблемы. Я имею в виду, почему использовать сам CF, а не C? Почему использовать C, а не сборку? Зачем использовать сторонний процессор, а не разрабатывать свой?

Помимо всего прочего, RestSharp поставляется с исходным кодом, и он бесплатный, так что есть небольшой риск в его использовании. Есть некоторые вещи, которые мне нравятся, в первую очередь, это то, что основная работа по вызовам REST выполнена. Я большой поклонник не изобретать вещи. У него есть некоторые причуды, которые я "исправил" локально (я имею в виду сделать запрос на извлечение, просто пока не нашел время), но они были незначительными, а не то, что я бы назвал "типичными" случаями.

Что касается вызова веб-API с помощью RestSharp, в этой статье есть довольно подробное описание.

Другие вопросы по тегам