.NET4 と Visual Studio 2010 で簡単な WebAPI サービスを作成しました。
Windows CE / CF 3.5 アプリでそのサービスを利用する必要がある
私は HttpWebRequest を利用できますが、これが正しい方法なのか、RestSharp を使用するべきなのかわかりません。私が決定するのに役立つ洞察/経験を持っている人はいますか? 私は可能な限りサードパーティのコードを使用しないことを好みますが、「生の」製品よりも明らかに利点がある場合は喜んで使用します。
CF 3.5 から HttpWebRequest または RestSharp を使用して WebApi サービスにアクセスするための例を持っている、または知っている人はいますか?
サンプル WebAPI メソッド用に、このコード ( http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web-apiから適応) があります。 :
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
これは、開発マシンのブラウザーで直接機能します。
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 アドレスを使用できますか?