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);
});
}
}
效果如下:
比如有这么一个需求,当用户选择文件后,需要查询数据库获取是否可上传,以及上传的最大限制。由于以上原因,不愿意使用WebServices或者WCF来获取数据,于是首先想到的是写在initParams参数里面,但是不够理想,如果设置比较多,或者有更多自定义的条件的话,不太好处理。接下来就想到了利用ASP.NET里面的一般处理程序,具体操作如下:
1)在initParams配置参数“UploadHandlerName=Ajax/HttpUploadHandler.ashx”。
2)在Silverlight程序中的添加文件的方法中编写请求代码。这块值得注意的,一是路径,二是获取到数据后,要使用this.Dispatcher.BeginInvoke来更新界面(否则会出异常)。具体代码如下:
{
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);
});
}
}
效果如下:
相关文章推荐
- servlet获取httpPost请求中的JSON数据
- 速战速决 (6) - PHP: 获取 http 请求数据, 获取 get 数据 和 post 数据, json 字符串与对象之间的相互转换
- java 发送http协议的POST请求获取数据
- android之HTTP请求后台数据,GSON解析数据,异步获取数据
- android通过httpClient请求获取JSON数据并且解析
- android通过httpClient请求获取JSON数据并且解析
- 使用HttpURLConnection发请求获取数据
- C# Get请求数据 WebClient和HttpWebRequest获取HTML代码
- android通过httpClient请求获取JSON数据并且解析
- Android新起线程 http请求数据发送 handler接收处理
- WebClient HttpWebRequest从网页中获取请求数据
- HTTP请求协议 get post方法 获取数据解析
- C# Get请求数据 WebClient和HttpWebRequest获取HTML代码 蓝色梦想网
- Android向EasyN摄像头发送http get请求获取媒体数据响应包
- vue2.5.2通过http请求获取静态的json数据
- HttpServletRequest 获取 http 请求xml格式数据
- android http数据通信 通过GET 请求获取数据
- 总结! http post请求 application/x-www-form-urlencoded body体数据获取不到?
- 如果你需要从不同的服务器(不同域名)上获取数据就需要使用跨域 HTTP 请求
- cocos2dx lua http请求获取网络数据: