关于Silverlight调用天气预报接口问题

问题:因Silverlight客户端不能直接调用webservice接口(外网天气接口),调用会出现跨域访问的问题,即使添加了跨域文件也不好使。解决方法如下

解决方法一:1.在服务端建立一个wcf服务端,在wcf里调用webservice接口(外网天气接口)

wcf服务接口IWeatherService.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Runtime.Serialization;
 5 using System.ServiceModel;
 6 using System.Text;
 7
 8 namespace WcfServiceWeather
 9 {
10     // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IWeatherService”。
11     [ServiceContract]
12     public interface IWeatherService
13     {
14         [OperationContract]
15         string[] GetCityWeather(string CityName);
16     }
17 }

wcf服务实现类WeatherService.cs

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Runtime.Serialization;
 5 using System.ServiceModel;
 6 using System.Text;
 7
 8 namespace WcfServiceWeather
 9 {
10     // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“WeatherService”。
11     // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 WeatherService.svc 或 WeatherService.svc.cs,然后开始调试。
12     public class WeatherService : IWeatherService
13     {
14         public string[] GetCityWeather(string CityName)
15         {
16             ServiceRefWeather.WeatherWebServiceSoapClient client = new ServiceRefWeather.WeatherWebServiceSoapClient("WeatherWebServiceSoap");
17             string[] cityNameWeather = client.getWeatherbyCityName(CityName);
18             return cityNameWeather;
19         }
20     }
21 }

添加完成后预览服务,将会在配置文件中自动生成相应的配置system.serviceModel

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3
 4   <appSettings>
 5     <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
 6   </appSettings>
 7   <system.web>
 8     <compilation debug="true" targetFramework="4.5" />
 9     <httpRuntime targetFramework="4.5"/>
10   </system.web>
11   <system.serviceModel>
12     <bindings>
13       <basicHttpBinding>
14         <binding name="WeatherWebServiceSoap" />
15       </basicHttpBinding>
16       <customBinding>
17         <binding name="WeatherWebServiceSoap12">
18           <textMessageEncoding messageVersion="Soap12" />
19           <httpTransport />
20         </binding>
21       </customBinding>
22     </bindings>
23     <client>
24       <endpoint address="http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"
25         binding="basicHttpBinding" bindingConfiguration="WeatherWebServiceSoap"
26         contract="ServiceRefWeather.WeatherWebServiceSoap" name="WeatherWebServiceSoap" />
27       <endpoint address="http://www.webxml.com.cn/WebServices/WeatherWebService.asmx"
28         binding="customBinding" bindingConfiguration="WeatherWebServiceSoap12"
29         contract="ServiceRefWeather.WeatherWebServiceSoap" name="WeatherWebServiceSoap12" />
30     </client>
31     <behaviors>
32       <serviceBehaviors>
33         <behavior>
34           <!-- 为避免泄漏元数据信息,请在部署前将以下值设置为 false -->
35           <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
36           <!-- 要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息 -->
37           <serviceDebug includeExceptionDetailInFaults="false"/>
38         </behavior>
39       </serviceBehaviors>
40     </behaviors>
41     <protocolMapping>
42         <add binding="basicHttpsBinding" scheme="https" />
43     </protocolMapping>
44     <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
45   </system.serviceModel>
46   <system.webServer>
47     <modules runAllManagedModulesForAllRequests="true"/>
48     <!--
49         若要在调试过程中浏览 Web 应用程序根目录,请将下面的值设置为 True。
50         在部署之前将该值设置为 False 可避免泄露 Web 应用程序文件夹信息。
51       -->
52     <directoryBrowse enabled="true"/>
53   </system.webServer>
54
55 </configuration>

2.Silverlight客户端添加服务引用(此处添加的是wcf的服务引用)

 1 ServiceReference1.WeatherServiceClient client = new ServiceReference1.WeatherServiceClient();
 2                 client.GetCityWeatherCompleted += (s, e) =>
 3                 {
 4                     try
 5                     {
 6                         if (e.Error == null)
 7                         {
 8                             var result=e.Result;//此处处理结果就ok了
 9                          }
10                     catch (Exception ex)
11                     {
12                         lbltitle1.Content = ex.Message;
13                     }
14
15                 };
16                 client.GetCityWeatherAsync("北京");

3.添加跨域文件clientaccesspolicy.xml

 1 <?xml version="1.0" encoding="utf-8" ?>
 2 <access-policy>
 3   <cross-domain-access>
 4     <policy>
 5       <allow-from http-request-headers="*">
 6         <domain uri="*"/>
 7       </allow-from>
 8       <grant-to>
 9         <resource include-subpaths="true" path="/"/>
10       </grant-to>
11     </policy>
12   </cross-domain-access>
13 </access-policy>

crossdomain.xml

1 <?xml version="1.0" encoding="UTF-8"?>
2 <!DOCTYPE cross-domain-policy SYSTEM "http://www.macromedia.com/xml/dtds/cross-domain-policy.dtd" >
3 <cross-domain-policy>
4   <site-control permitted-cross-domain-policies="all" />
5   <allow-access-from domain="*" />
6   <allow-http-request-headers-from domain="*" headers="*"/>
7 </cross-domain-policy>

解决方法二:直接在Silverlight的web中添加wcf无法文件、添加(外网天气服务接口)处理天气接口,然后在客户端直接调用自己创建的wcf,此时客户端会产生一个ServiceReferences.ClientConfig的文件

 1 <configuration>
 2     <system.serviceModel>
 3         <bindings>
 4             <basicHttpBinding>
 5                 <binding name="BasicHttpBinding_IWeatherService" maxBufferSize="2147483647"
 6                     maxReceivedMessageSize="2147483647">
 7                     <security mode="None" />
 8                 </binding>
 9             </basicHttpBinding>
10         </bindings>
11         <client>
12             <endpoint address="http://192.168.0.161:8080/bjsw/WCF/WeatherService.svc"
13                 binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IWeatherService"
14                 contract="ServiceReference1.IWeatherService" name="BasicHttpBinding_IWeatherService" />
15         </client>
16     </system.serviceModel>
17 </configuration>

在客户端直接调用就ok了

  

关于Silverlight调用天气预报接口问题,布布扣,bubuko.com

时间: 2024-07-31 08:02:45

关于Silverlight调用天气预报接口问题的相关文章

调用天气预报接口

方案一: 浏览器由于安全的限制,不允许跨域访问.但是PHP服务器是允许的.我们可以通过使用PHP文件做代理,通过PHP来调用接口. 详细接口分析可参看:http://www.cnblogs.com/wangjingblogs/p/3192953.html 返回JSON格式 PHP代码 <?php //此接口返回json格式 echo file_get_contents('http://www.weather.com.cn/data/cityinfo/101181601.html'); ?> H

webservice通信调用天气预报接口实例

转载:http://www.cnblogs.com/warrior4236/p/5668449.html 一:环境搭建 1:新建一个java project工程weatherInf 2:引入相应的jar包 activation.jaraxis-ant.jaraxis.jarcommons-discovery-0.2.jarcommons-logging-1.0.4.jarjaxrpc.jarlog4j-1.2.8.jarmail.jarsaaj.jarwsdl4j-1.5.1.jar 下载axi

项目中调用天气预报接口

项目中使用的是心知天气的API,下面我就简单总结一下使用的过程: 1. 在心知天气官网注册一个个人账号,这样就会产生一个API秘钥和一个用户ID,用户ID用于签名验证方式.签名指的是通过HMAC-SHA1,对请求参数加密后得到的签名字串进行身份验证,避免了将API密钥明文包含在请求中而造成泄露. 2. 关于签名生成方式如下: (1)构造验证参数字符串 将请求参数按照参数名字典升序排列后,把所有参数param=value用&连接起来,类似URI中Query string的构造方式.目前支持的参数有

C#调用国家气象局天气预报接口

原文:C#调用国家气象局天气预报接口 一.需求 最近,刚好项目中有天气预报查询功能的需求,要求录入城市名称,获取该城市今日天气信息及相关气象生活辅助信息等. 例如:查询北京市天气 结果为: 今日北京天气:15℃~5℃ 阵雨转阴,北风3-4级,天气冷,建议着棉服.羽绒服.皮夹克加羊毛衫等冬季服装.年老体弱者宜着厚棉衣.冬大衣 或厚羽绒服. 洗车指数:不宜.紫外线指数:最弱.晨练指数:较不宜.舒适指数:较舒适. 还好,国家气象局提供相关接口,再此表示感谢,虽然个人觉得该api设计思路有待提高,但是相

【转载】C#调用国家气象局天气预报接口

一.需求 最近,刚好项目中有天气预报查询功能的需求,要求录入城市名称,获取该城市今日天气信息及相关气象生活辅助信息等. 例如:查询北京市天气 结果为: 今日北京天气:15℃~5℃ 阵雨转阴,北风3-4级,天气冷,建议着棉服.羽绒服.皮夹克加羊毛衫等冬季服装.年老体弱者宜着厚棉衣.冬大衣 或厚羽绒服. 洗车指数:不宜.紫外线指数:最弱.晨练指数:较不宜.舒适指数:较舒适. 还好,国家气象局提供相关接口,再此表示感谢,虽然个人觉得该api设计思路有待提高,但是相比于其他部委[如交通部]来说,气象局这

PHP调用API接口实现天气查询功能

天气预报查询接口API,在这里我使用的是国家气象局天气预报接口 使用较多的还有:新浪天气预报接口.百度天气预报接口.google天气接口.Yahoo天气接口等等. 1.查询方式 根据地名查询各城市天气情况 2.请求URL地址http://route.showapi.com/9-2 3.接口参数说明: 一.系统级参数(所有接入点都需要的参数): 二.应用级参数(每个接入点有自己的参数): 4.返回参数 以JSON格式返回结果 1)系统级参数(所有接入点都会返回的参数) 2)应用级参数(系统级输出参

【黑马Android】(14)webservice概念/调用/wsdl接口

webservice 的概念 webservice 就是一个应用程序,它提供一种通过web方式访问的api. 解决两个系统或者(应用程序)之间的远程调用..... 调用是跨语言,跨平台... webservice 最基本的组成部分就是客户端,服务端... MyServerSocket.java package cn.itcast.server; import java.io.IOException; import java.io.InputStream; import java.net.Serv

最简单最好用的天气预报接口

天气预报接口有许多,有的很复杂,调用下面这个Flash,就可以轻松的把天气预报加到你的文章里. 点击看效果 <div><embed style="DispLAY: block; WiDTH: 600px; HeiGHT: 500px; TexT-ALiGn: center" src="http://weather.news.sina.com.cn/deco/2009/1224/china.swf" type="application/x-

silverlight调用WebService传递json接收绑定数据

1.接收数据: WebService通过接口接收数据.类型为object 2.类型转换: 通过json转换方法将object转换为json格式数据 3.调用WebService方法: silverlight调用WebService方法,接收json数据 4.转换数据: silverlight引用Newtonsoft.Json.Silverlight.dll文件,调用JsonConvert.DeserializeObject<T>(json)方法进行格式转换就可以利用数据 比如:List<