这篇文章主要围绕Silverlight访问JavaWebservice策略文件安放位置和javaweb项目访问路径展开,旨在为您提供一份详细的参考资料。我们将全面介绍Silverlight访问Java
这篇文章主要围绕Silverlight访问Java Webservice策略文件安放位置和javaweb项目访问路径展开,旨在为您提供一份详细的参考资料。我们将全面介绍Silverlight访问Java Webservice策略文件安放位置的优缺点,解答javaweb项目访问路径的相关问题,同时也会为您带来19.Silverlight调用webservice上传多个文件、21.循环访问WebService方法来看Silverlight下WebService异步请求、22.Silverlight使用WebService调用C++,Delphi编写的DLL文件、ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法的实用方法。
本文目录一览:- Silverlight访问Java Webservice策略文件安放位置(javaweb项目访问路径)
- 19.Silverlight调用webservice上传多个文件
- 21.循环访问WebService方法来看Silverlight下WebService异步请求
- 22.Silverlight使用WebService调用C++,Delphi编写的DLL文件
- ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法
Silverlight访问Java Webservice策略文件安放位置(javaweb项目访问路径)
在项目开发过程中,如果前台使用Silvrlight开发,调用Java开发Webservice。在部署Webservice的时候要注意,策略文件要正确放置,才能起到效果。
1、常见的Tomcat部署,要将策略文件放置到 ./webapps/ROOT/ 文件夹下。
2、如果使用Nginx做负载均衡,要将策略文件放置到 html 文件夹下。
附带策略文件:clientaccesspolicy.xml
<?xml version="1.0" encoding="utf-8"?> <access-policy> <cross-domain-access> <policy> <allow-from http-request-headers="SOAPAction"> <domain uri="*"/> </allow-from> <grant-to> <resource path="/" include-subpaths="true"/> </grant-to> </policy> </cross-domain-access> </access-policy>
19.Silverlight调用webservice上传多个文件
Silverlight不支持读写服务器端的硬盘,可是很多时候用户需要在Silverlight客户端往服务器端上传文件,那么本节将讲述 Silverlight中最简单的上传文件的方式:在Silverlight客户端将文件序列化为Byte[]字符组,然后服务器端使用 webService接收客户端的数据并且还原为文件即可。
下面我们新建一个Silverlight应用程序解决方案SLUpload,然后在SLUpload.Web项目中鼠标右键点击此项目,添加一个web服务页面Upload。在此页面中写入下面代码:
- /// <summary>
- /// 上传文件
- /// </summary>
- /// <param name="FileByte">文件的字节</param>
- /// <param name="FileName">文件名</param>
- /// <param name="FileExtention">文件扩展名</param>
- /// <param name="SavePath">文件保存地址</param>
- /// <returns></returns>
- [WebMethod]
- public string Uploadfile(byte[] FileByte,string FileName,string SavePath)
- {
- //文件的保存位置
- string filepath = SavePath + FileName;
- //判断在该位置是否有相同的文件。有的话则删除原来同名的文件
- if (File.Exists(filepath))
- {
- //删除该位置的同名文件
- File.Delete(filepath);
- }
- //根据传入的byte[]数据和文件位置创建一个FileStream实例
- using (FileStream stream = new FileStream(filepath, FileMode.CreateNew))
- {
- //向文件中写入数据流
- stream.Write(FileByte, 0, FileByte.Length);
- };
- return FileName;
- }
这个Web服务方法的参数分别代表传输过来的文件内容字节组、文件名、文件保存路径。对于方法中使用的相关操作都在上面源码中有说明,我就不多说了。下面 我们在SLUpload项目中鼠标右键点击项目名,然后“添加服务引用”,填入SLUpload.Web的upload.asmx页面的URL地址并且命 名空间填写为UpLoadService点击确定,即在SLUpload项目中引用了webservice服务。下面我们看MainPage.xaml的 代码如下:
- <Grid x:Name="LayoutRoot" Background="White">
- <Button Content="上 传" Height="23" HorizontalAlignment="Left" Margin="20,36,0" Name="btnUpload" VerticalAlignment="Top" Width="75" Click="btnUpload_Click" />
- <ListBox Height="183" HorizontalAlignment="Left" Margin="112,0" Name="listBox1" VerticalAlignment="Top" Width="232" />
- <Button Content="清 空" Height="23" HorizontalAlignment="Left" Margin="20,88,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
- </Grid>
下面我们看MainPage.xaml.cs的关键代码,注意这里需要引用:using System.IO;using SLUpload.UpLoadService;这两个域名空间:
- private void btnUpload_Click(object sender, RoutedEventArgs e)
- {
- //设置一个选择文件的窗口的实例,并且设置为多选
- OpenFileDialog dialog = new OpenFileDialog();
- dialog.Multiselect=true;
- if (dialog.ShowDialog().Value)
- {
- //循环获取多选到的文件,然后将这些集合都通过调用webService上传
- foreach (FileInfo file in dialog.Files)
- {
- //读取Stream
- Stream stream = file.OpenRead();
- stream.Position = 0;
- //设置字节数组初始化
- byte[] buffer = new byte[stream.Length + 1];
- //将文件写入字节数组中
- stream.Read(buffer, buffer.Length);
- string fileName = file.Name;
- //调用webService服务方法上传文件
- UploadSoapClient upfile = new UploadSoapClient();
- //设置缓冲区存取的字符、文件名称、文件保存路径,并且调用方法上传
- upfile.UploadfileAsync(buffer, fileName, "C:\\");
- upfile.UploadfileCompleted += new EventHandler<UploadfileCompletedEventArgs>(upfile_UploadfileCompleted);
- }
- }
- else
- {
- MessageBox.Show("你没有选择文件,请重新选择文件!");
- }
- }
- void upfile_UploadfileCompleted(object sender, UploadfileCompletedEventArgs e)
- {
- this.listBox1.Items.Add(e.Result + "文件上传成功!");
- }
- private void button1_Click(object sender, RoutedEventArgs e)
- {
- this.listBox1.Items.Clear();
- }
这样一个最简单的Silverlight上传就做好了,但是在实际运行当中我们观察得出这种上传方式只能够上传小于2M的文件。那是因为 ServiceReferences.ClientConfig文件的webService传输配置中设置 的 maxBufferSize="2147483647" 。很显然,在实际中我们如果要传输大文件的话,就需要考虑将一个大文件切割成为数个小文件来进行传输。这是下一个话题。
本实例采用VS2010+Silverlight 4.0编写。请点击 SLUpload.rar 下载源码实例。
21.循环访问WebService方法来看Silverlight下WebService异步请求
问题:笔者在项目中需要循环一个WebService方法N次,以获得N个结果数据,但是这过程中出现了一些问题,获取到的结果数据量大于笔者的预期且值为N*N。
Silverlight中常见的数据访问方式都是通过类似于WebService异步请求方式来获取的,相信大部分人都会这个WebService的请求 方法,但是在某一个需要输入参数获取一个结果的WebService方法中,假设我们需要循环输入N个参数,然后获取N个结果集的情况下进行的操作会出现 什么情况呢?本文将围绕循环WebService循环访问探讨一下Silverlight中的异步WebService数据请求过程。
首先新建一个Silverlight应用程序项目,在Web项目中添加Wservice.asmx的服务页面,在页面内我们创建一个WebService 方法源码如下,输入参数为1、2、3、4、5的情况下,获得相应的结果为(参数---word)如1---word,2---word。
- [WebMethod]
- public string GetData(int id)
- {
- string rstr = string.Empty;
- rstr = id.ToString() + "---word";
- return rstr;
- }
下面我们编写一个实体类,来绑定ListBox控件。源码如下:
- /// <summary>
- /// 信息类 属性Id为ID值,属性Infostr为信息类的字符值
- /// </summary>
- public class info
- {
- int id;
- string infostr;
- public int Id
- {
- get { return id; }
- set { id = value; }
- }
- public string Infostr
- {
- get { return infostr; }
- set { infostr = value; }
- }
- }
下面我们在XAML文件中添加两个ListBox和两个Button控件。分别用来显示错误的多条数据的情况和正确的N条数据的情况。
- <ListBox Height="193" HorizontalAlignment="Left" Margin="61,29,0" Name="listBox1" VerticalAlignment="Top" Width="154" />
- <Button Content="获取25个WebService数据" Height="23" HorizontalAlignment="Left" Margin="61,240,0" Name="button1" VerticalAlignment="Top" Width="154" Click="button1_Click" />
- <ListBox Height="193" HorizontalAlignment="Left" Margin="264,0" Name="listBox2" VerticalAlignment="Top" Width="154" />
- <Button Content="获取5个WebService数据" Height="23" HorizontalAlignment="Left" Margin="264,0" Name="button2" VerticalAlignment="Top" Width="154" Click="button2_Click" />
下面我们查看CS中的关键代码如下:
- #region 获取到错误的数据条数 条数是N*N
- /// <summary>
- /// 获取错误的多条数据的方法
- /// </summary>
- public void GetMoreList()
- {
- //清除infoMoreList数据集,然后循环访问WebService方法
- infoMoreList.Clear();
- for (int i = 1; i < 6; i++)
- {
- MoreClient.GetDataAsync(i);
- MoreClient.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(wClient_GetDataCompleted);
- }
- }
- void wClient_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
- {
- info inf = new info()
- {
- Id=1, Infostr=e.Result
- };
- infoMoreList.Add(inf);
- }
- #endregion
- #region 获取正确的数据条数
- /// <summary>
- /// 获取正确数据的方法
- /// </summary>
- public void GetList()
- {
- //清除infoList数据集,然后循环访问WebService方法
- infoList.Clear();
- for (int i = 1; i < 6; i++)
- {
- LessClient.GetDataAsync(i);
- }
- LessClient.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(wClient_LessGetDataCompleted);
- }
- void wClient_LessGetDataCompleted(object sender, GetDataCompletedEventArgs e)
- {
- info inf = new info()
- {
- Id=1, Infostr=e.Result
- };
- infoList.Add(inf);
- }
- #endregion
关键在于for循环之中有没有包括MoreClient.GetDataCompleted事件的加载。
第一种错误的情况下每次循环发出异步请求加载一次GetDataCompleted事件,一共循环五次,那么加载了5次GetDataCompleted事件的时候,也发出了5次的Ansyc(i)请求,所以5*5=25次获取事件结果数据,这是错误的!
第二种正确的情况下每次循环发出异步的Ansyc(i)请求即可,只是在循环完之后加载一次GetDataCompleted事件即可,然后就会执行 5*1=5次获取事件结果处理。通过每刷新程序,然后按Button键得到的右边ListBox数据排列不同可以看出:发出请求的时间顺序和得到结果的时 间顺序是不一致的。
下图展示两种情况得到的数据如下:
本实例的所有源代码如下,点击代码展开观看:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.Services;
- namespace SLWebService.Web
- {
- /// <summary>
- /// Wservice 的摘要说明
- /// </summary>
- [WebService(Namespace = "http://tempuri.org/")]
- [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
- [System.ComponentModel.ToolBoxItem(false)]
- // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
- // [System.Web.Script.Services.ScriptService]
- public class Wservice : System.Web.Services.WebService
- {
- [WebMethod]
- public string GetData(int id)
- {
- string rstr = string.Empty;
- rstr = id.ToString() + "---word";
- return rstr;
- }
- }
- }
- <UserControl xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk" x:Class="SLWebService.MainPage"
- xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d"
- d:DesignHeight="800" d:DesignWidth="800">
- <Grid x:Name="LayoutRoot" Background="White">
- <ListBox Height="193" HorizontalAlignment="Left" Margin="61,0" Name="listBox1" VerticalAlignment="Top" Width="154" />
- <Button Content="获取25个WebService数据" Height="23" HorizontalAlignment="Left" Margin="61,0" Name="button1" VerticalAlignment="Top" Width="154" Click="button1_Click" />
- <ListBox Height="193" HorizontalAlignment="Left" Margin="264,0" Name="listBox2" VerticalAlignment="Top" Width="154" />
- <Button Content="获取5个WebService数据" Height="23" HorizontalAlignment="Left" Margin="264,0" Name="button2" VerticalAlignment="Top" Width="154" Click="button2_Click" />
- </Grid>
- </UserControl>
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Net;
- using System.Windows;
- using System.Windows.Controls;
- using System.Windows.Documents;
- using System.Windows.Input;
- using System.Windows.Media;
- using System.Windows.Media.Animation;
- using System.Windows.Shapes;
- using System.Threading;
- using SLWebService.ServiceReference1;
- namespace SLWebService
- {
- public partial class MainPage : UserControl
- {
- public MainPage()
- {
- InitializeComponent();
- //初始化的时候就执行
- GetMoreList();
- GetList();
- }
- List<info> infoMoreList = new List<info>();
- List<info> infoList = new List<info>();
- WserviceSoapClient MoreClient = new WserviceSoapClient();
- WserviceSoapClient LessClient = new WserviceSoapClient();
- private void button1_Click(object sender, RoutedEventArgs e)
- {
- this.listBox1.ItemsSource = infoMoreList;
- this.listBox1.displayMemberPath = "Infostr";
- }
- private void button2_Click(object sender, RoutedEventArgs e)
- {
- this.listBox2.ItemsSource = infoList;
- this.listBox2.displayMemberPath = "Infostr";
- }
- #region 获取到错误的数据条数 条数是N*N
- /// <summary>
- /// 获取错误的多条数据的方法
- /// </summary>
- public void GetMoreList()
- {
- //清除infoMoreList数据集,然后循环访问WebService方法
- infoMoreList.Clear();
- //错误的循环获取WebBSer
- for (int i = 1; i < 6; i++)
- {
- MoreClient.GetDataAsync(i);
- MoreClient.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(wClient_GetDataCompleted);
- }
- }
- void wClient_GetDataCompleted(object sender, Infostr=e.Result
- };
- infoMoreList.Add(inf);
- }
- #endregion
- #region 获取正确的数据条数
- /// <summary>
- /// 获取正确数据的方法
- /// </summary>
- public void GetList()
- {
- //清除infoList数据集,然后循环访问WebService方法
- infoList.Clear();
- for (int i = 1; i < 6; i++)
- {
- LessClient.GetDataAsync(i);
- }
- LessClient.GetDataCompleted += new EventHandler<GetDataCompletedEventArgs>(wClient_LessGetDataCompleted);
- }
- void wClient_LessGetDataCompleted(object sender, Infostr=e.Result
- };
- infoList.Add(inf);
- }
- #endregion
- }
- /// <summary>
- /// 信息类 属性Id为ID值,属性Infostr为信息类的字符值
- /// </summary>
- public class info
- {
- int id;
- string infostr;
- public int Id
- {
- get { return id; }
- set { id = value; }
- }
- public string Infostr
- {
- get { return infostr; }
- set { infostr = value; }
- }
- }
- }
本实例采用VS2010+Silverlight 4.0编写,点击 SLWebService.rar 下载源代码。
22.Silverlight使用WebService调用C++,Delphi编写的DLL文件
在Silverlight程序(非Out of browser模式)中是无法直接调用DLL的,但是很多的计算或者其他应用程序的调用中我们需要用到DLL的加载。比如调用DLL来识别身份证读卡器传 输过来的信号,比如要和某Delph编写的程序数据通讯等等。本文将简单的自写一个DLL文件,然后通过调用此DLL自定义的一个GetNum函数计算传 入得两个参数之和。
首先我们使用VS2010编写一个名为IlasLinkDll.dll的C++语言DLL文件(编写这个DLL的源码也会在本章结尾附带),其内部的关键代码如下:
- #ifdef MYLIBDLL @H_301_19@
- #define MYLIBDLL extern "C" _declspec(dllimport) @H_301_19@
- #else @H_301_19@
- #define MYLIBDLL extern "C" _declspec(dllexport) @H_301_19@
- #endif @H_301_19@
- MYLIBDLL double GetNum(double Anum,double Bnum); @H_301_19@
- @H_301_19@
- double GetNum(double Anum,double Bnum) @H_301_19@
- { @H_301_19@
- @H_301_19@
- return Anum+Bnum; @H_301_19@
- } @H_301_19@
然后我们新建一个名为sllinkDLl的Silverlight应用程序项目,在sllinkDLl.Web项目中我们引用 IlasLinkDll.dll文件,新建一个Wservice.asmx的web服务文件。在此文件中编写以下代码且添加using System.Runtime.InteropServices;的引用:
- [WebMethod] @H_301_19@
- public string GetNumber(double A,double B) @H_301_19@
- { @H_301_19@
- return GetNum(A, B).ToString() ; @H_301_19@
- @H_301_19@
- } @H_301_19@
- /// <summary> @H_301_19@
- /// 获取到DLL的值 @H_301_19@
- /// </summary> @H_301_19@
- /// <param name="Anumber">数字A</param> @H_301_19@
- /// <param name="Bnumber">数字B</param> @H_301_19@
- /// <returns></returns> @H_301_19@
- [DllImport("IlasLinkDll.dll", CharSet = CharSet.Ansi, EntryPoint = "GetNum", ExactSpelling = false)] @H_301_19@
- public static extern double GetNum(double Anumber, double Bnumber); @H_301_19@
最后在Silverlight程序中鼠标右键点击项目名--添加服务引用--添加http://localhost:4389/Wservice.asmx地址即可。在MainPage.xaml.cs文件中写入以下关键代码即可调用WebService中的GetNumber方法,通过DLL计算两个数字之间的和,返回显示出来。
- public MainPage() @H_301_19@
- { @H_301_19@
- InitializeComponent(); @H_301_19@
- //创建webService代理类的对象实例 @H_301_19@
- WServiceSoapClient sclient=new WServiceSoapClient(); @H_301_19@
- //调用GetNumber方法,并传递两个参数 @H_301_19@
- sclient.GetNumberAsync(500,23); @H_301_19@
- sclient.GetNumberCompleted += new EventHandler<GetNumberCompletedEventArgs>(sclient_GetNumberCompleted); @H_301_19@
- @H_301_19@
- } @H_301_19@
- @H_301_19@
- void sclient_GetNumberCompleted(object sender, GetNumberCompletedEventArgs e) @H_301_19@
- { @H_301_19@
- //结果将为523 @H_301_19@
- MessageBox.Show(e.Result); @H_301_19@
- } @H_301_19@
通过上面的代码我们传入500和23两个参数。然后得到结果为523的弹出窗口。下面我们看一下加载DLL的DllImport特性的参数使用方法:
- [DllImport("IlasLinkDll.dll", ExactSpelling = false)] @H_301_19@
- @H_301_19@
- a、CallingConvention 参数指示入口点的调用约定。如果未指定 CallingConvention,则使用默认值 CallingConvention.Winapi。 @H_301_19@
- b、CharSet 参数指示用在入口点中的字符集。如果未指定 CharSet,则使用默认值 CharSet.Auto。 @H_301_19@
- c、EntryPoint 参数给出 dll 中入口点的名称。如果未指定 EntryPoint,则使用方法本身的名称。 @H_301_19@
- d、ExactSpelling 参数指示 EntryPoint 是否必须与指示的入口点的拼写完全匹配。如果未指定 ExactSpelling,则使用默认值 false。 @H_301_19@
- e、PreserveSig 参数指示方法的签名应当被保留还是被转换。当签名被转换时,它被转换为一个具有 HRESULT 返回值和该返回值的一个名为 retval 的附加输出参数的签名。如果未指定 PreserveSig,则使用默认值 true。 @H_301_19@
- f、SetLastError 参数指示方法是否保留 Win32"上一错误"。如果未指定 SetLastError,则使用默认值 false。 @H_301_19@
Tip:笔者在某一个项目中遇到无论指明什么EntryPoint入口点和CharSet字符集都无法加载一个第三方DLL文件时,就直接自己使用C++ 编写了一个DLL文件来加载这个C#中无法识别加载的第三方DLL,然后在C#中调用自己编写的DLL文件解决了问题。
本实例源码由VS2010+Silverlight4.0编写,点击 SLLinkDLl.rar 下载本实例源码。点击 IlasLinkDll.rar 下载DLL文件源码。
ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法
群里好几个朋友都提到过这样的问题,说他们在Silverlight中调用了WebService方法,总报这个错误,贴图如下:
解决办法:
1、确定你的Silverlight项目及承载Silverlight的Web程序根目录下都包含2个跨域文件,分别是crossdomain.xml和clientaccesspolicy.xml:
crossdomain.xml文件,如下:
<?xml version="1.0"?> <cross-domain-policy> <allow-access-from domain="*" /> </cross-domain-policy>clientaccesspolicy.xml文件,如下:
<?xml version="1.0" encoding="utf-8"?> <access-policy> <cross-domain-access> <policy> <allow-from> <domain uri="*"/> </allow-from> <grant-to> <resource path="/" include-subpaths="true"/> </grant-to> </policy> </cross-domain-access> </access-policy>2、在Silverlight中添加Web服务引用的时候,不要使用VS自带的类似http://localhost:90801/XXX/xxx.asmx地址,将承载Silverlight的Web程序部署到IIS中,然后添加Web服务引用,地址类似http://localhost/XXX/YYY/xxx.asmx,当然前提你的WebService要是正确的。接下来的一步很重要,打开引用完成后的服务引用配置文件,如果服务地址在本地的话,请去掉地址中的应用程序名前面的符号,如下图:
关于Silverlight访问Java Webservice策略文件安放位置和javaweb项目访问路径的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于19.Silverlight调用webservice上传多个文件、21.循环访问WebService方法来看Silverlight下WebService异步请求、22.Silverlight使用WebService调用C++,Delphi编写的DLL文件、ArcGIS API for Silverlight 调用WebService出现跨域访问报错的解决方法的相关信息,请在本站寻找。
本文标签: