您的位置:首页 > 理论基础 > 计算机网络

Silverlight——Silverlight请求HttpHandler获取数据

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

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

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

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

publicclassRequestStates { ///<summary> ///当前请求 ///</summary> publicHttpWebRequestCurrentWebRequest{get;set;} ///<summary> ///当前用户文件 ///</summary> publicUserFileCurrentUserFile{get;set;} }
privatevoidAddFile(FileInfofile) { stringfileName=file.Name; varuserFile=newUserFile{FileName=file.Name,FileStream=file.OpenRead()}; if(!string.IsNullOrEmpty(Configuration.Instance.CheckExtensionsHandlerName)) { //获取处理的Handler类的路径 UriBuilderhttpHandlerUrlBuilder=newUriBuilder(newCustomUri(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)+"&"); //创建请求 HttpWebRequestrequest=(HttpWebRequest)WebRequest.Create(httpHandlerUrlBuilder.Uri); request.Method="POST"; //设置自定义信息,用于异步请求 varrequestStates=newRequestStates() { CurrentUserFile=userFile, CurrentWebRequest=request }; //开始异步请求 request.BeginGetRequestStream(newAsyncCallback(RequestReady),requestStates); } else { _files.Add(userFile); } }

privatevoidRequestReady(IAsyncResultasynchronousResult)
{
varrequestStates=(RequestStates)asynchronousResult.AsyncState;
HttpWebRequestwebRequest=requestStates.CurrentWebRequest;
StreamrequestStream=webRequest.EndGetRequestStream(asynchronousResult);
requestStream.Close();
webRequest.BeginGetResponse(newAsyncCallback(ResponseReady),requestStates);
}
voidResponseReady(IAsyncResultasyncResult)
{
varrequestStates=(RequestStates)asyncResult.AsyncState;
HttpWebRequestwebRequest=requestStates.CurrentWebRequest;
varuserFile=requestStates.CurrentUserFile;
varwebResponse=(HttpWebResponse)webRequest.EndGetResponse(asyncResult);
varreader=newStreamReader(webResponse.GetResponseStream());
//获取Httphandler类返回的数据
stringresponsestring=reader.ReadToEnd();
reader.Close();
decimalmaxSize=Convert.ToDecimal(responsestring);
//Checkforthefilesizelimit(configurable)
if(maxSize==0||(userFile.FileStream.Length/1024)<=maxSize)
{
this.Dispatcher.BeginInvoke(
()=>_files.Add(userFile)
);

}
elseif(maxSize<0)
{
this.Dispatcher.BeginInvoke(
delegate()
{
varmessageWindow=newMessageChildWindow
{
Message=
string.Format("不允许上传{0}类文件!",
Path.GetExtension(userFile.FileName))
};
messageWindow.Show();

if(MaximumFileSizeReached!=null)
MaximumFileSizeReached(this,null);
});
}
else
{
this.Dispatcher.BeginInvoke(
()=>
{
varmessageWindow=newMessageChildWindow
{
Message=
string.Format("{0}{1}{2}KB.",
Path.GetExtension(userFile.FileName),
UserMessages.MaxFileSize,(maxSize).ToString())
};
messageWindow.Show();

if(MaximumFileSizeReached!=null)
MaximumFileSizeReached(this,null);
});
}
}
效果如下:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: