需要帮助为Silverlight项目编写web api包装器

时间:2014-06-03 04:32:09

标签: c# webclient silverlight-5.0 asp.net-web-api

请耐心等待我,因为我是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)使用WebClienthttp://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,如代码所示。

将非常感谢帮助。欢迎任何符合我要求的新代码片段。

1 个答案:

答案 0 :(得分:0)

RestSharp帮助我而不是WebClient。