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

C# 需要帮助为Silverlight项目编写web api包装器吗,c#,webclient,silverlight-5.0,asp.net-web-api,C#,Webclient,Silverlight 5.0,Asp.net Web Api,请容忍我,因为我是Silverlight的新手。我需要编写一个web api包装器(我把它命名为WebClientWrapper),它应该使用rest服务。该项目使用Silverlight 5。我在写这样一个包装时面临着很多问题。有许多示例演示了C#中的rest服务消耗。但不幸的是,他们都没有为我工作。完成我所需要的对我来说是一个挑战。以下是我的要求: 1) 当我发出任何GET请求时,UI不应冻结 2) 从webclientrapper调用方法应该尽可能简单 3) 不应更改project的.NE

请容忍我,因为我是Silverlight的新手。我需要编写一个web api包装器(我把它命名为
WebClientWrapper
),它应该使用rest服务。该项目使用Silverlight 5。我在写这样一个包装时面临着很多问题。有许多示例演示了C#中的rest服务消耗。但不幸的是,他们都没有为我工作。完成我所需要的对我来说是一个挑战。以下是我的要求:

1) 当我发出任何GET请求时,UI不应冻结

2) 从
webclientrapper
调用方法应该尽可能简单

3) 不应更改project的.NET framework版本

到目前为止,我试着做了以下事情

1) 使用。我引用了以下链接:。这种方法的问题是我不能调用ReadAsAsync方法。调用此方法需要更改框架(即替换DLL或更改框架版本),这是不可行的

2) 使用
问题是,我可能(不确定!)必须改变从WebClient Rapper调用方法的方式。我正在尝试从WebClient Rapper调用方法,如下所示:

var appointments = WebClientWrapper.Get<Appointments>(new Dictionary<string, string>()
        {
            {"hospitalId", "19465654546"}
        }, "appointment");
var-appoinces=WebClientWrapper.Get(新字典()
{
{“hospitalId”,“194654546”}
}“任命”);
下面是我在WebClient Rapper中尝试的代码片段

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));
    }
private const string BaseUrl=”http://localhost:63455/api";
私有静态WebClient GetClient()
{
int leadingInt=new Random().Next(1000099999);
int trailingInt=newrandom().Next(10009999);
字符串日期=DateTime.Now.ToString(“ddhhmmmsmmyyyyys”);
string ticketString=string.Format(“{0}{1}{2}”,leadingInt,date,trailingInt);
var client=new WebClient();
client.Headers[“Accept”]=ticketString;
client.Headers[“UserAgent”]=“前台应用程序”;
返回客户;
}
私有静态void DownloadCompletionHandler(对象发送方,DownloadStringCompletedEventArgs e)
{
Encoding messageEncoding=Encoding.UTF8;
var serializer=newdatacontractjsonserializer(typeof(T));
var memoryStream=newmemorystream(messageEncoding.GetBytes(e.Result));
var objectToReturn=(T)serializer.ReadObject(memoryStream);
}
公共静态T Get(字典、字符串控制器)
{
字符串absoluteUrl=BaseUrl+controller+“?”;
absoluteUrl=paramDictionary.Aggregate(absoluteUrl,
(当前,keyValuePair)=>current+(keyValuePair.Key+“=”+keyValuePair.Value+“&”);
absoluteUrl=absoluteUrl.TrimEnd('&');
WebClient client=GetClient();
client.DownloadStringCompleted+=downloadcomletionhandler;
DownloadStringAsync(新Uri(绝对URL));
}
以下是我想提及的关于上述代码的内容

1) 很明显,编译器为方法
Get
抛出错误,因为我没有返回
T
类型的对象。如何从
DownloadStringAsync
获取该对象?我知道我可以使用
下载StringTaskAsync
。但在当前的框架中,它不可用。我必须在代码中进行哪些更改才能获得
约会
,如
get
方法调用中所示

2)
DownloadCompletionHandler
必须返回
void
,但实际上我想返回
objectToReturn
,如代码所示

非常感谢您的帮助。欢迎任何满足我要求的新代码片段。

帮助我而不是WebClient