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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

上一节我们建立了一个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>
再尝试一下:


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

这样我们就完成了WCF服务的调用,下一节我和大家一起研究怎么把这些数据做成专题图,并且利用自定义的样式控制他们。
ArcGIS Web 编辑中 只读字段和隐藏字段设置 1  需求来源 在与客户交流过程中,遇到这样一个问题:在Web端(如Silverlight程序中)进行要素属性编辑时,如何设置字段的只读,或者隐藏某些字段呢? 当时听到这个问题,第一反应是通过编辑模板来进行控制,但是并没有找到合适的地方。今天问了问其他同事,得知可以通过层属性进行设置,于是进行了测试,真就成功了,这里要谢谢北京的张文老师。 2  数据设置 要进行web编辑,数 阅读详情

相关推荐

【2012Esri中国用户大会讲座】ArcGIS 10.1 for Server 安全机制(2)使用Token

1  关于Token在本系列第一篇博客中已经介绍了用户、角色、权限,在访问这些经过权限设置的服务时,会有用户认证和权限验证两个主要的步骤:用户认证:判断用户输入的用户名是否存在,密码是否正确;权限验证:判断该用户是否对请求的资源具有访问权限。认证的方式有两种:基于ArcGIS Token的认证和Web服务器认证,本文将介绍最常用的第一种认证方式。简单说,Token就是一串含了用户信息的加密字符串

esricd的专栏 4562

ArcGIS Viewer for Silverlight 系列:扩展Viewer之自定义布局

前面一篇博客讲了Application Builder快速构建应用,一些简单的应用、只需要常用功能的GIS应用,使用Builder内置的布局、工具基本能够满足需求。但是,在这个讲究XXX特色的地方,甲方往往不喜欢千篇一律的界面、一模一样的弹窗、更不能容忍没有用户登录的系统。那么我们先来讲讲如何自定义Viewer的布局。 ArcGIS Viewer for SL系列的这篇博客及以后的博客都需要安装...

iteye_8029的博客 171

ArcGIS Viewer for Silverlight 离线文档

ArcGIS Viewer for Silverlight 最新版 离线文档

ArcGIS Viewer for Silverlight 系列:使用Application Builder快速构建GIS应用

ArcGIS Viewer for Silverlight 的Application Builder是一个用于快速构建基于ArcGIS Viewer的向导式应用,是所见即所得的应用。接下来我们来一步一步操作一下。 Application Builder初次安装完成后,在点击“开始”菜单——“所有程序”——“ArcGIS”——“ArcGIS Viewer for Silverlight 1.0.1...

iteye_8029的博客 207

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

在我的工作中遇到有的用户喜欢使用ArcGIS Viewer for Silverlight搭建一些简单的工程,用来作为即将建立的系统的原型系统,或者尝试一些功能,这是一种很方便快捷的方式。但是并不是所有的功能都能够使用Viewer配置完成,有时候扩展开发是必须的。 尤其是有的用户在别的系统中已经有了一系列的数据访问封装好的WCF,只是需要在Viewer完成数据的调用和显示,那么就更需要对Vie...

iteye_8029的博客 177

ArcGIS Viewer for Silverlight 系列:简介

本内容转自:http://support.esrichina-bj.cn/2011/0512/1108.html ArcGIS Viewer for Microsoft Silverlight  是一个可立即部署,可配置的,富因特网应用,它基于 ArcGIS API for Microsoft Silverlight 。 ArcGIS Viewer for Silv

esricd的专栏 2129

ArcGIS Viewer for Silverlight 开发环境

1、ArcGIS API for Microsoft Silverlight 3.0 地址:http://www.esri.com/apps/products/download/index.cfm?fuseaction=download.main&downloadid=714 ArcGIS Extensibility SDK for Silverlight 3.0 地址:http:/...

weixin_30438813的博客 158

ArcGIS API for Silverlight 点沿着线流动

ArcGIS API for Silverlight 点沿着线流动概述

mytudousi的专栏 4241

Windows 7 配置ArcGIS Viewer for Silverlight

步骤一:在Windows7上安装ArcGIS Viewer for Microsoft Silverlight,系统必须开启某些系统功能,需要:1、ASP.NET2、Static Content3、IIS Management Console在“打开或关闭Windows 功能”列表的顺序如下。同时,因为在安装完成ArcGIS9.3之后会因为系统注册表大小被限制的情况,导致在打开“打开或关闭Windows功能”时显示一个空列表的情况。所以需要修改下注册表的相关键值。步骤:同时因为ArcGIS Viewer

marine008的专栏 2008

Silverlight加载xap 使用WCF

<br /><br />这个问题搞了我一个晚上,终于找到原因了,但还不知道是不是最终的解决办法,先用着吧。<br /> <br />我利用MEF动态加载一个外部XAP。被加载的XAP使用WCF,单独测试都通过,就是加载报错,通过反复分析,原因是在应用程序 xap 中找不到文件“ServiceReferences.ClientConfig”<br /> <br />被加载后的XAP默认的是主体的XAP,是在主体的XAP里没有“ServiceReferences.ClientConfig”是因为主体

whj198579的专栏 1676

ArcGIS API for Silverlight应用开发系列(1)自定义专题

ArcGIS API for Silverlight 中提供的内置专题渲染类型括简单符号化、唯一值符号化和分级符号化,如果想要实现其他的专题类型,如饼、柱状、仪表盘等,则需要 通过自定义开发的方式进行扩展。 自定义专题类型的基本思路是使用ElementLayer与表控件(如开源的 Visifire)相结合,在 ElementLayer 的 Children集合中添加表对象(UI元

esricd的专栏 7533

多源在线与离线数据读取之五(Android移动端开发读取四川地理信息中心地名搜索服务

本实例在前一博客的基础上,主要是针对四川地理信息中心的地名搜索服务,如果利用ArcGIS for Android API进行解析,并接入地理编码信息进行搜索定位。 1)基础准备:下载Java版的Json库(http://code.google.com/p/json-simple/)、熟悉四川地理信息中心地名搜索规则 2)关于地理地理信息中心地名搜索服务规则,说见其网站,这里不多介绍(http:

esricd的专栏 7047

ArcGIS Server 客户端开发中如何使用自定义坐标系

1  场景描述 本文的应用场景,是要通过某市的行政区划,去查询覆盖指定县市的影像数据。其中行政区划采用Xian80地理坐标系,而影像数据则采用了该市的地方平面坐标系,因此需要进行坐标转换。 下文将为您介绍如何在ArcGIS Server开发中进行坐标系转换。 2  关于自定义坐标系 本文所谓的自定义坐标系,是指没有含在ArcGIS自带的坐标系中的坐标系。比如你通过ArcGIS

esricd的专栏 6822

扩展ArcGIS API for Silverlight/WPF 中的TextSymbol支持角度标注

ArcGIS API for Silverlight/WPF中原版的TextSymbol只能支持文字正向显示。在很多实际项目中,往往需要文字标注有一些角度甚至是沿线标注,下面我们来看一下原装的TextSymbol和扩展后的TextSymbol的比较和实现思路。 要实现右的效果只需要从TextSymbol继承一个Symbol并增加Rotation属性,并加载相应的控件模板就行了。 以下是

esricd的专栏 5075

ArcGIS API for Silverlight应用开发系列(2)客户端读取Shapefile

系统是死的,数据是活的,在一些涉及敏感数据的地方,可能需要提供访问客户端数据的功能。例如:在某单位内部有一个基于ArcGIS  Silverlight  API的WebGIS系统,提供了一些常用的业务功能,能够访问一些基础地理数据和基本的业务数据。而有的业务数据,由于保密要求,可能不通过系统直接提供,需要在客户端直接访问。 在客户端访问Shapefile,可以通过直接读取的方式,以及将数据传回服

esricd的专栏 5028
上一篇: 去除ArcMap中Catalog窗口中的失效文件夹连接
下一篇: 基于Vmware构建基础云设施的方法
Esri成都
博客等级 码龄14年 1017粉丝 257原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值