请教jv9版主及高手们一个问题,关于sliverlight调用webservice部署的问题

zhuawang 2012-07-17 02:03:23
是这样的,我用了一个sliverlight的多文件上传,其中是调用了服务器的webservice实现上传数据。现在的做法是sliverlight项目引用了webservice服务后生成ClientBin下的文件再部署。问题就是,如果webservice的地址变了,又要在项目中重新引用webservice的服务地址再生成ClientBin下文件再部署。这样就很麻烦,是否有更好的方法能像一般的asp.ne项目那样把webservice的地址写在外面,如果webservice的地址变了只要改地址而不需要重新编译生成ClientBin下的文件再部署.
请jv9版主及其他高手们教我,谢谢!!
...全文
129 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuawang 2012-07-20
  • 打赏
  • 举报
回复
非常感谢,解决了我长时间困惑的难题
jv9 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]
为什么我在webservice的站点下加了 crossdomain.xml 还是不能跨域访问这个webservice呢?
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
[/Quote]

Silverlight Runtime在检测安全策略文件时,是先检测clientaccesspolicy.xml 再检测crossdomain.xml文件.一旦请求完成,策略文件在整个应用程序会话周期内一直有效,也就是说不用每次都请求这个文件了。如果第一次请求该文件失败,那么接下来的请求同样的也会失败。策略文件只能放置在根目录下,无论你当前请求的资源是位于网站的哪个目录下。

而跨域文件crossdomain.xml是Flash的跨域策略文件,
clientaccesspolicy.xml是Silverlight的跨域策略文件。

你需要添加并配置clientaccesspolicy.xml文件。开放所有访问权限,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<access-policy>
<cross-domain-access>
<policy>
<allow-from http-request-headers="*">
<domain uri="*"/>
</allow-from>
<grant-to>
<resource path="/" include-subpaths="true"/>
</grant-to>
</policy>
</cross-domain-access>
</access-policy>


详细教程可以参考:

http://silverlightchina.net/html/tips/2011/0830/10082.html
http://silverlightchina.net/html/tips/2011/0522/7832.html
http://silverlightchina.net/html/tips/2010/0107/563.html
http://silverlightchina.net/html/tips/2011/0925/10630.html
jv9 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]
new ComplaintServiceClient("BasicHttpBinding_IComplaintService"

你这个的 BasicHttpBinding_IComplaintService 是什么呢?
[/Quote]

BasicHttpBinding_IComplaintService 这个是项目定义的服务绑定名,在Web.config中可以看到.
白鸽 2012-07-18
  • 打赏
  • 举报
回复
这个是页面上那个object中,添加的。就是加载你silverlight的那个页面,我这里是asp.net <param name="initParams"ip2=localhost:31581" />添加这个东东,ip2指示的就是你要变化的服务地址。


在调用服务的类中你可以通过下面的方式引用地址,ComplaintServiceClient这个是你引用的webservice的客户端,我这里是WCF,这样就能动态配置地址了!
_client = new ComplaintServiceClient("BasicHttpBinding_IComplaintService", string.Format("http://{0}/Services/ComplaintService.svc", System.Windows.Application.Current.Host.InitParams["ip2"]));

如果不明白再说。。
zhuawang 2012-07-18
  • 打赏
  • 举报
回复
new ComplaintServiceClient("BasicHttpBinding_IComplaintService"

你这个的 BasicHttpBinding_IComplaintService 是什么呢?
zhuawang 2012-07-18
  • 打赏
  • 举报
回复
为什么我在webservice的站点下加了 crossdomain.xml 还是不能跨域访问这个webservice呢?
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*" />
</cross-domain-policy>
zhuawang 2012-07-18
  • 打赏
  • 举报
回复
非常感谢,我一直以为要打包到ClientBin里面才行。
  • 打赏
  • 举报
回复
例如我们的一个小实习人员程序,他就可以做到:首先判断InitParams有没有设置,然后判断IsolatedStorageSettings参数有没有设置,然后判断远程参数服务网站有没有设置,全都没有设置的时候,会默认地从 Application.Host.Source 中分解出当前网页的域名+端口号并拼成web服务地址。

这样有经验或者自己动脑筋地开发,而不是简单地抄书本代码去开发,就能适合部署的需要。
  • 打赏
  • 举报
回复
在你实例化可以客户端代理的时候,你除了无参数的方法,有没有看过其它重载?它有多达5个重载,如果你没有看过,那么你搞开发就太简单了。

至少,有一个重载有两个参数, (string endpointConfigurationName, string remoteAddress)这样定义的,其中第二个参数就可以定义你的服务器地址。

这样,你可以报服务器的域名从任意地址得到,不仅仅可以写到项目中,也可以从某个http服务器下载你的软件的配置参数,或者从silverlight的宿主网页(通常是html页面)的InitParams参数获得,或者要求用户第一次登录时配置/输入服务器域名并永久保存到客户端。总之服务器地址是你自己灵活编程的,是你应该设计的业务逻辑的一部分,不要被配置文件给栓死。
jv9 2012-07-17
  • 打赏
  • 举报
回复
可以将WebService的地址放在Web.Config文件中,根据项目部署目录不同,修改Web.Config文件就可以了。

8,735

社区成员

发帖
与我相关
我的任务
社区描述
WPF/Silverlight相关讨论
社区管理员
  • WPF/Silverlight社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧