如何在ArcGIS Viewer for Silverlight中使用WCF服务完成降雨量专题图显示(二)

如何在ArcGIS Viewer for Silverlight中使用WCF服务完成降雨量专题图显示(二),第1张

概述上一节我们建立了一个Viewer for Silverlight的空工具,并且让它能够在我们配置的Viewer框架中调用,接下来我们就讲述怎么在这个工具中调用WCF服务。 首先完善一下QueryToolWindow,让它能够查询发出的服务图层的数据,并能将数据在Viewer生成的应用程序中显示出来。 关键代码为: public partial class QueryToolWindow : Use

上一节我们建立了一个VIEwer for Silverlight的空工具,并且让它能够在我们配置的VIEwer框架中调用,接下来我们就讲述怎么在这个工具中调用WCF服务。

首先完善一下queryToolWindow,让它能够查询发出的服务图层的数据,并能将数据在VIEwer生成的应用程序中显示出来。

关键代码为:

public partial class queryToolWindow : UserControl    {        queryTool queryTool = null;        queryTask queryTask = null;        Graphicslayer RainPointLayer = null;        public queryToolWindow(queryTool queryTool)        {            this.queryTool = queryTool;            InitializeComponent();            this.Loaded += new RoutedEventHandler(queryToolWindow_Loaded);        }        voID queryToolWindow_Loaded(object sender,RoutedEventArgs e)        {            this.queryTask = new queryTask(this.queryTool.LayersDic["Point"]);            this.queryTask.Failed += new EventHandler<TaskFailedEventArgs>(queryTask_Failed);            this.queryTask.ExecuteCompleted += new EventHandler<queryEventArgs>(queryTask_ExecuteCompleted);            query query = new query()            {                Where = "1=1",ReturnGeometry = true,OutFIElds = new OutFIElds() { "ID" },OutSpatialReference = MapApplication.Current.Map.SpatialReference            };            this.queryTask.ExecuteAsync(query);        }        voID queryTask_ExecuteCompleted(object sender,queryEventArgs e)        {            Graphicslayer layer = new Graphicslayer();            layer.Renderer = new SimpleRenderer() {                 Symbol = new SimpleMarkerSymbol(){                     color = new SolIDcolorBrush(colors.Red),Size = 10                } };            foreach (Graphic graphic in e.Featureset)            {                layer.Graphics.Add(graphic);            }            MapApplication.Current.Map.Layers.Add(layer);        }        voID queryTask_Failed(object sender,TaskFailedEventArgs e)        {            MessageBox.Show("查询失败!");        }}}
点击queryTool的图标显示如下图:

现在进入重头戏,建立并调用WCF。

首先在解决方案中新建一个WCF服务应用程序,如图:

在本例中我就不实现对数据库的调用啥的了,直接在服务中返回个double的列表,用来当作雨量数据。

public class Service : IService    {        public Dictionary<int,double> GetRainData(int value)        {            Dictionary<int,double> Result = new Dictionary<int,double>();            Random TheRandom = new Random();            for (int i = 0; i < value; i++)            {                Result.Add(i,TheRandom.NextDouble() * 100);            }            return Result;        }    }

现在按照大家的理解,应该是在建立的WCFSilverlight工程中添加Service的服务引用了吧?

先这样尝试下:


添加之后在queryToolWindow中添加引用using WCFSilverlight.ServiceReference

在queryToolWindow中添加个按钮来调用下服务,看是否可以使用。


运行一下,点击button之后就会出现这个错误:



“在 .xap 应用程序包中无法找到“ServiceReferences.ClIEntConfig”。”????!!

开什么玩笑,它不是明明白白的在我的工程里面吗?



这就是我想给大家分享这篇博客的最主要原因了。我当初碰到这个问题的时候甚至把.xap用zip解出来看到底放进去了没有,结果是有!


那么,问题就清楚了,包里面有东西但是没有应有的效果,这就证明是VIEwer生成的站点不去解析这个文件!仔细想想,我突然恍然大悟:这个ClIEntConfig应该放在站点的根目录才能有配置作用啊,但是通过.xap打包了之后,显然宿主站点不认识这个文件了。

那么让我们看看这个配置文件配置了些什么吧。

<configuration>    <system.serviceModel>        <bindings>            <!-- 绑定方式 -->            <basichttpBinding>                <binding name="BasichttpBinding_IService" maxBufferSize="2147483647"                    maxReceivedMessageSize="2147483647">                    <security mode="None" />                </binding>            </basichttpBinding>        </bindings>        <clIEnt>            <!-- 客户端终结点 -->            <endpoint address="http://localhost:50572/Service.svc" binding="basichttpBinding"                bindingConfiguration="BasichttpBinding_IService" contract="ServiceReference.IService"                name="BasichttpBinding_IService" />        </clIEnt>    </system.serviceModel></configuration>

我已经把他们各自配置的作用注释上去了,那么是不是意味着只要我用代码实现了这些配置,服务就能正常用了呢?

于是把上面的button事件改成这样:

private voID button_Click(object sender,RoutedEventArgs e)        {            //定义绑定            Binding bingding = new BasichttpBinding(BasichttpSecurityMode.None) { MaxReceivedMessageSize = int.MaxValue,MaxBufferSize = int.MaxValue };            //定义终结点            EndpointAddress address = new EndpointAddress("http://localhost:9015/Service.svc");            ServiceClIEnt ClIEnt = new ServiceClIEnt(bingding,address);            ClIEnt.GetRainDataCompleted += new EventHandler<GetRainDataCompletedEventArgs>(ClIEnt_GetRainDataCompleted);            ClIEnt.GetRainDataAsync(200);        }        voID ClIEnt_GetRainDataCompleted(object sender,GetRainDataCompletedEventArgs e)        {            MessageBox.Show(e.Result.Count.ToString());        }
结果还是报错,不过好在错误已经不是原来那个了:


如图,其实是在站点http://localhost:50572下面没有合适的跨域策略文件。

这里注意,需要在ClIEntAccesspolicy.xml允许http-request-headers:

<?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>
再尝试一下:


很好!查询的框d出来了。

这样我们就完成了WCF服务的调用,下一节我和大家一起研究怎么把这些数据做成专题图,并且利用自定义的样式控制他们。 总结

以上是内存溢出为你收集整理的如何在ArcGIS Viewer for Silverlight中使用WCF服务完成降雨量专题图显示(二)全部内容,希望文章能够帮你解决如何在ArcGIS Viewer for Silverlight中使用WCF服务完成降雨量专题图显示(二)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1017228.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存