我在.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)
...我明白了,“无法连接到远程服务器”
这个 直接在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地址?
答案 0 :(得分:1)
避免第三方代码失控只是愚蠢。为什么重新发明轮子?如果你是一家IP正在进行REST调用的公司,那么肯定,滚动它,但我怀疑你的核心业务是解决其他一些问题。我的意思是为什么使用CF本身,而不是C?为什么使用C而不是汇编?为什么要使用第三方处理器而不是自己设计呢?
除此之外,RestSharp附带源代码并且它是免费的,因此使用它的风险很小。我喜欢它的一些东西 - 主要是REST调用的大部分工作都已完成。我不喜欢重新发明事物。它有一些我在本地“修复”的怪癖(我的意思是做拉动请求,但还没有找到时间)但是它们很小而不是我认为是“典型”的情况。
至于使用RestSharp调用Web API,有一个pretty thorough coverage over in this article。