Silverlight——Silverlight请求HttpHandler获取数据

在Silverlight里面调用WebServices和WCF是一件麻烦的事,在开发的时候,如果IP更改了,总是需要重配或者更新。虽然可以动态绑定,但是IP还是要配吧,而且性能比写死的要慢很多。而且,还得在根目录加上跨域XML。那么有什么解决方案呢?

比如有这么一个需求,当用户选择文件后,需要查询数据库获取是否可上传,以及上传的最大限制。由于以上原因,不愿意使用WebServices或者WCF来获取数据,于是首先想到的是写在initParams参数里面,但是不够理想,如果设置比较多,或者有更多自定义的条件的话,不太好处理。接下来就想到了利用ASP.NET里面的一般处理程序,具体操作如下:

1)在initParams配置参数“UploadHandlerName=Ajax/HttpUploadHandler.ashx”。

2)在Silverlight程序中的添加文件的方法中编写请求代码。这块值得注意的,一是路径,二是获取到数据后,要使用this.Dispatcher.BeginInvoke来更新界面(否则会出异常)。具体代码如下:

1
2
3
4
5
6
7
8
9
10
11
public class RequestStates
{
    /// <summary>
    /// 当前请求
    /// </summary>
    public HttpWebRequest CurrentWebRequest { get; set; }
    /// <summary>
    /// 当前用户文件
    /// </summary>
    public UserFile CurrentUserFile { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
private void AddFile(FileInfo file)
{
    string fileName = file.Name;
    var userFile = new UserFile { FileName = file.Name, FileStream = file.OpenRead() };
 
    if (!string.IsNullOrEmpty(Configuration.Instance.CheckExtensionsHandlerName))
    {
        //获取处理的Handler类的路径
        UriBuilder httpHandlerUrlBuilder = new UriBuilder(new CustomUri(Configuration.Instance.CheckExtensionsHandlerName));
        //设置请求的参数
        httpHandlerUrlBuilder.Query = string.Format("{2}file={0}&Extension={1}", HttpUtility.UrlEncode(userFile.FileName), HttpUtility.UrlEncode(Path.GetExtension(userFile.FileName)), string.IsNullOrEmpty(httpHandlerUrlBuilder.Query) ? string.Empty : httpHandlerUrlBuilder.Query.Remove(0, 1) + "&");
        //创建请求
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(httpHandlerUrlBuilder.Uri);
        request.Method = "POST";
        //设置自定义信息,用于异步请求
        var requestStates = new RequestStates()
                                 {
                                     CurrentUserFile = userFile,
                                     CurrentWebRequest = request
                                 };
        //开始异步请求
        request.BeginGetRequestStream(new AsyncCallback(RequestReady), requestStates);
    }
    else
    {
        _files.Add(userFile);
    }
}
1
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
private void RequestReady(IAsyncResult asynchronousResult)
{
    var requestStates = (RequestStates)asynchronousResult.AsyncState;
    HttpWebRequest webRequest = requestStates.CurrentWebRequest;
    Stream requestStream = webRequest.EndGetRequestStream(asynchronousResult);
    requestStream.Close();
    webRequest.BeginGetResponse(new AsyncCallback(ResponseReady), requestStates);
}
void ResponseReady(IAsyncResult asyncResult)
{
    var requestStates = (RequestStates)asyncResult.AsyncState;
    HttpWebRequest webRequest = requestStates.CurrentWebRequest;
    var userFile = requestStates.CurrentUserFile;
    var webResponse = (HttpWebResponse)webRequest.EndGetResponse(asyncResult);
    var reader = new StreamReader(webResponse.GetResponseStream());
    //获取Httphandler类返回的数据
    string responsestring = reader.ReadToEnd();
    reader.Close();
    decimal maxSize = Convert.ToDecimal(responsestring);
    //Check for the file size limit (configurable)
    if (maxSize == 0 || (userFile.FileStream.Length / 1024) <= maxSize)
    {
        this.Dispatcher.BeginInvoke(
            () => _files.Add(userFile)
            );
 
    }
    else if (maxSize < 0)
    {
        this.Dispatcher.BeginInvoke(
            delegate()
            {
                var messageWindow = new MessageChildWindow
                                                       {
                                                           Message =
                                                               string.Format("不允许上传{0}类文件!",
                                                                             Path.GetExtension(userFile.FileName))
                                                       };
                messageWindow.Show();
 
                if (MaximumFileSizeReached != null)
                    MaximumFileSizeReached(this, null);
            });
    }
    else
    {
        this.Dispatcher.BeginInvoke(
            () =>
            {
                var messageWindow = new MessageChildWindow
                                        {
                                            Message =
                                                string.Format("{0}{1}{2}KB.",
                                                              Path.GetExtension(userFile.FileName),
                                                              UserMessages.MaxFileSize, (maxSize).ToString())
                                        };
                messageWindow.Show();
 
                if (MaximumFileSizeReached != null)
                    MaximumFileSizeReached(this, null);
            });
    }
}

效果如下:

image

image

posted @   雪雁  阅读(2128)  评论(5编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示