HttpWebRequest上的RFC与Windows CE / Compact Framework 3.5中的RESTSharp

时间:2013-10-07 22:10:53

标签: asp.net-web-api compact-framework windows-ce restsharp .net-cf-3.5

我在.NET4和Visual Studio 2010中创建了一个简单的WebAPI服务。

我需要在Windows CE / CF 3.5应用程序中使用该服务

我确实可以使用HttpWebRequest,但我不确定这是否可行,或者我应该使用RestSharp。有没有人有经验可以帮我决定?我不想在可能的情况下使用第三方代码来避免它,但如果有明显的优势,我愿意这样做。

是否有人拥有或知道使用CF 3.5中的HttpWebRequest或RestSharp访问WebApi服务的示例?

我有这个代码(改编自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)。

更新

我启动了具有WebAPI方法的VS2010应用程序;但是当我使用以下代码运行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

这个 直接在dev机器上的浏览器中工作:

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

它从Controller返回这些值:

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 个答案:

答案 0 :(得分:1)

避免第三方代码失控只是愚蠢。为什么重新发明轮子?如果你是一家IP正在进行REST调用的公司,那么肯定,滚动它,但我怀疑你的核心业务是解决其他一些问题。我的意思是为什么使用CF本身,而不是C?为什么使用C而不是汇编?为什么要使用第三方处理器而不是自己设计呢?

除此之外,RestSharp附带源代码并且它是免费的,因此使用它的风险很小。我喜欢它的一些东西 - 主要是REST调用的大部分工作都已完成。我不喜欢重新发明事物。它有一些我在本地“修复”的怪癖(我的意思是做拉动请求,但还没有找到时间)但是它们很小而不是我认为是“典型”的情况。

至于使用RestSharp调用Web API,有一个pretty thorough coverage over in this article