由于微软在Silverlight安全方面的设计,Silverlight是无法以filestream的方式直接从本地读取文件,而只能从服务器上获取数据。在VS2010Silverlight项目里,上半部分为客户端代码,下部分即项目.Web为服务端。
对于一个常规的C/S模式,即客户端发出请求,服务端相应请求。Silverlight提供了几种方法,本文主要采用了 (1)WCF Service(图书已经讲的很清楚Ref1:Beginning.Silverlight.4.in.CSharp.Jul.2010) (2)WebClient(Ref2:http://www./dotnet/silverlight/silverlight_20100702_4963.html)
本文应用需求为:客户端输入x,服务端查询文件y,得到z,最后返回z给客户端。 (1)WCF参数传递问题: Server.MethodCompleted += new EventHandler<MethodCompletedEventArgs (Service_GetGeobyIPCompleted);//需要添加事件处理 Server.MethodAsync(arg);//其中arg即为参数,注意WCF Service定义的方法为Method,客户端调用的是.MethodAsync()。 (2)WCF结果的获取:e.Result();//(MethodCompletedEventArgs ) (3)WCF访问本地文件的问题:可以直接采用绝对地址的方法,如(E:/>a.txt) 采用相对地址时会出现问题,若直接用“a.txt”,则默认目录为:C:/Program Files/Common Files/Microsoft Shared/DevServer/10.0/a.txt,至于是为什么,Google了半天也不知道。若要采用相对路径,首先要知道当前 请求的路径: String DataPath = System.Web.HttpContext.Current.Request.MapPath("a.txt"); 该句表示在当前请求路径下的a.txt文件。对于VS2010,当前请求路径即为:项目.Web文件夹;若要发布到ISS上, 请求路径即为:../IIS/项目 (4)Silverlight在VS2010自带的IIS中可以正常运行,但发布后却会报错。报错一般为e.Result,即无法获得结果。这里有 两个问题,一是文件访问控制(vs和IIS以不同的身份访问),二是WCF的服务地址问题。需要做一下更改: a.首先设置好IIS(http://hi.baidu.com/forgetmenot_jamon/blog/item/2dee8921b4dd094593580735.html),其中需要在wwwroot目录下放置好clientpolicy文件。 b.在.ClientConfig中更改WCFService的请求地址:<endpoint address="http://localhost/Project/Service.svc",VS默认是在其自带的IIS中的某个端口中。 c.设置wwwroot下的虚拟目录为应用程序。虚拟目录即为VS项目发布到IIS的目录,转化成应用程序后,才可以访问服务。 d.VS2010在发布的时候,只会发布相关的目标文件,并不会发布访问的资源文件,需要手动拷贝到虚拟目录下。问题多的吐血啊... e.Ok,测试一下,大功告成!耶!
(5)Webclient有同样的问题,但是很诡异的是,只需要把虚拟目录设置为应用程序,同时在访问资源的时候相对路径的设置同上。 |
|
来自: Jcstone > 《Silverlight》