首页 > 代码库 > 关于Silverlight调用天气预报接口问题
关于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 IWeatherService13 {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 : IWeatherService13 {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=http://www.mamicode.com/"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了
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。