请耐心等待我,因为我是Silverlight的新手。我需要编写一个web api包装器(我将它命名为WebClientWrapper
),它应该使用休息服务。该项目使用 Silverlight 5 。在编写这样的包装器时,我遇到了很多问题。有很多例子证明了C#中的休息服务消费。但不幸的是,他们都没有为我工作。完成我需要的工作对我来说是一个挑战。以下是我的要求:
1)当我发出任何GET请求时,UI不应该冻结,
2)从WebClientWrapper
调用方法应该尽可能简单。
3)不应更改项目的.NET框架版本。
到目前为止我尝试了以下内容:
1)使用HttpClient。我引用了这个链接:http://www.asp.net/web-api/overview/web-api-clients/calling-a-web-api-from-a-net-client。这种方法的问题是我无法调用ReadAsAsync方法。调用此方法需要更改框架(即替换dll或更改框架版本),这是不可行的。
2)使用WebClient。 http://www.kastory.net/index.php?option=com_content&view=article&id=25:rest-web-service-in-c-with-silverlight-and-asp-net-web-api&catid=32:web-services&Itemid=130。
这个问题是我可能(不确定!)必须改变我从WebClientWrapper调用方法的方式。我试图从WebClientWrapper完成调用方法,如下所示:
var appointments = WebClientWrapper.Get<Appointments>(new Dictionary<string, string>()
{
{"hospitalId", "19465654546"}
}, "appointment");
以下是我在WebClientWrapper中尝试过的代码段。
private const string BaseUrl = "http://localhost:63455/api";
private static WebClient GetClient()
{
int leadingInt = new Random().Next(10000, 99999);
int trailingInt = new Random().Next(1000, 9999);
string date = DateTime.Now.ToString("ddHHmmMMssMMyyyyyss");
string ticketString = string.Format("{0}{1}{2}", leadingInt, date, trailingInt);
var client = new WebClient();
client.Headers["Accept"] = ticketString;
client.Headers["UserAgent"] = "ReceptionistApp";
return client;
}
private static void DownloadCompletionHandler<T>(object sender, DownloadStringCompletedEventArgs e)
{
Encoding messageEncoding = Encoding.UTF8;
var serializer = new DataContractJsonSerializer(typeof (T));
var memoryStream = new MemoryStream(messageEncoding.GetBytes(e.Result));
var objectToReturn = (T) serializer.ReadObject(memoryStream);
}
public static T Get<T>(Dictionary<string, string> paramDictionary, string controller)
{
string absoluteUrl = BaseUrl + controller + "?";
absoluteUrl = paramDictionary.Aggregate(absoluteUrl,
(current, keyValuePair) => current + (keyValuePair.Key + "=" + keyValuePair.Value + "&"));
absoluteUrl = absoluteUrl.TrimEnd('&');
WebClient client = GetClient();
client.DownloadStringCompleted += DownloadCompletionHandler<T>;
client.DownloadStringAsync(new Uri(absoluteUrl));
}
以下是我要提及的有关上述代码的内容:
1)很明显,编译器会抛出方法Get<T>
的错误,因为我没有返回T
类型的对象。我该如何从DownloadStringAsync
获取该对象?我知道我可以使用DownloadStringTaskAsync
。但它不适用于当前框架。我必须在代码中进行哪些更改才能获得appointments
方法调用中显示的Get<Appointments>
?
2)DownloadCompletionHandler<T>
必然会返回void
,但实际上我想返回objectToReturn
,如代码所示。
将非常感谢帮助。欢迎任何符合我要求的新代码片段。