解决方案:
1. 在目标服务器上发布webservice,实现文件下载的方法。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.IO; using System.Data; namespace TRNWebService { /// <summary> /// FileHelperService 的摘要说明 /// </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 FileHelperService : System.Web.Services.WebService { /// <summary> /// 从指定文件夹下获取文件 /// </summary> /// <param name="dicpath"></param> /// <returns></returns> [WebMethod(EnableSession = true, Description = "获取文件夹下面的文件")] public DataTable GetFileList(string dicpath) { DataTable dt = new DataTable(); dt.TableName = "AEFiles"; dt.Columns.Add("fileName", typeof(string)); dt.Columns.Add("filePath", typeof(string)); DirectoryInfo dir = System.IO.Directory.CreateDirectory(dicpath); if (dir == null) { return null; } FileInfo[] files = dir.GetFiles(); for (int i = 0; i < files.Length; i++) { FileInfo file = files[i] as FileInfo; if (file != null) { dt.Rows.Add(file.Name, file.FullName); } } return dt; } [WebMethod(Description = "下载服务器站点文件,传递文件相对路径")] public byte[] DownloadFile(string strFilePath) { FileStream fs = null; //string CurrentUploadFolderPath = Server.MapPath(System.Configuration.ConfigurationManager.AppSettings["UploadFileFolder"]); //string CurrentUploadFilePath = CurrentUploadFolderPath + strFilePath; string CurrentUploadFilePath = strFilePath; if (File.Exists(CurrentUploadFilePath)) { try { ///打开现有文件以进行读取。 fs = File.OpenRead(CurrentUploadFilePath); int b1; System.IO.MemoryStream tempStream = new System.IO.MemoryStream(); while ((b1 = fs.ReadByte()) != -1) { tempStream.WriteByte(((byte)b1)); } return tempStream.ToArray(); } catch (Exception ex) { return new byte[0]; } finally { fs.Close(); } } else { return new byte[0]; } } } }
2. 客户端利用反射实现webservice,把文件下载到本地的安装目录
3. 客户端打开已经存放在本地的文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.CodeDom.Compiler; using System.Net; using System.IO; using Microsoft.CSharp; using System.CodeDom; using System.Web.Services.Description; namespace Frm.Common { public static class WebServiceInvoke { #region InvokeWebService //动态调用web服务 public static object InvokeWebService(string url, string methodname, object[] args) { return InvokeWebService(url, null, methodname, args); } public static object InvokeWebService(string url, string classname, string methodname, object[] args) { string @namespace = "TRNWebService"; if ((classname == null) || (classname == "")) { classname = GetWsClassName(url); } try { //获取WSDL WebClient wc = new WebClient(); Stream stream = wc.OpenRead(url + "?WSDL"); ServiceDescription sd = ServiceDescription.Read(stream); ServiceDescriptionImporter sdi = new ServiceDescriptionImporter(); sdi.AddServiceDescription(sd, "", ""); CodeNamespace cn = new CodeNamespace(@namespace); //生成客户端代理类代码 CodeCompileUnit ccu = new CodeCompileUnit(); ccu.Namespaces.Add(cn); sdi.Import(cn, ccu); CSharpCodeProvider csc = new CSharpCodeProvider(); ICodeCompiler icc = csc.CreateCompiler(); //设定编译参数 CompilerParameters cplist = new CompilerParameters(); cplist.GenerateExecutable = false; cplist.GenerateInMemory = true; cplist.ReferencedAssemblies.Add("System.dll"); cplist.ReferencedAssemblies.Add("System.XML.dll"); cplist.ReferencedAssemblies.Add("System.Web.Services.dll"); cplist.ReferencedAssemblies.Add("System.Data.dll"); //编译代理类 CompilerResults cr = icc.CompileAssemblyFromDom(cplist, ccu); if (true == cr.Errors.HasErrors) { System.Text.StringBuilder sb = new System.Text.StringBuilder(); foreach (System.CodeDom.Compiler.CompilerError ce in cr.Errors) { sb.Append(ce.ToString()); sb.Append(System.Environment.NewLine); } throw new Exception(sb.ToString()); } //生成代理实例,并调用方法 System.Reflection.Assembly assembly = cr.CompiledAssembly; Type t = assembly.GetType(@namespace + "." + classname, true, true); object obj = Activator.CreateInstance(t); System.Reflection.MethodInfo mi = t.GetMethod(methodname); return mi.Invoke(obj, args); } catch (Exception ex) { throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace)); } } private static string GetWsClassName(string wsUrl) { string[] parts = wsUrl.Split('/'); string[] pps = parts[parts.Length - 1].Split('.'); return pps[0]; } #endregion } }
/// <summary> /// 通过WebService下载文件 /// </summary> /// <param name="ServiceFilePath">服务器图片路径</param> /// <param name="DownloadFolderPath">本地图片路径</param> private string DownloadFile(string ServiceFilePath, string DownloadFolderPath) { try { string DownloadFileName = ""; if (ServiceFilePath.Contains("/")) { DownloadFileName = ServiceFilePath.Substring(ServiceFilePath.LastIndexOf("/")); } else if (ServiceFilePath.Contains("\")) { DownloadFileName = ServiceFilePath.Substring(ServiceFilePath.LastIndexOf("\")+1); } else { DownloadFileName = ServiceFilePath; } string DownloadFilePath = DownloadFolderPath + "\" + DownloadFileName; Dictionary<string, string> dicSystem = Common.AppConfigSys.AppConfigDic; string strUrl = dicSystem["webserviceURL"];//webservice的发布位置(http://192.168.10.3:8084/FileHelperService.asmx) object[] objPara = new object[1]; objPara[0] = ServiceFilePath; object objFile = Frm.Common.WebServiceInvoke.InvokeWebService(strUrl, "DownloadFile", objPara); byte[] bytes = (byte[])objFile; if (bytes != null) { if (!Directory.Exists(DownloadFolderPath)) { Directory.CreateDirectory(DownloadFolderPath); } if (!File.Exists(DownloadFilePath)) { File.Create(DownloadFilePath).Dispose(); } //如果不存在完整的上传路径就创建 FileInfo downloadInfo = new FileInfo(DownloadFilePath); if (downloadInfo.IsReadOnly) { downloadInfo.IsReadOnly = false; } //定义并实例化一个内存流,以存放提交上来的字节数组。 MemoryStream ms = new MemoryStream(bytes); //定义实际文件对象,保存上载的文件。 FileStream fs = new FileStream(DownloadFilePath, FileMode.Create); ///把内内存里的数据写入物理文件 ms.WriteTo(fs); fs.Flush(); ms.Flush(); ms.Close(); fs.Close(); fs = null; ms = null; } return DownloadFilePath; } catch (Exception ex) { return ""; } }
void AElink_Click(object sender, EventArgs e) { LinkLabel link = sender as LinkLabel; string serverfilePath = link.Tag.ToString();//服务器上的文件地址 string clientfilePath = DownloadFile(serverfilePath, Application.StartupPath + "\UploadFileFolder");//客户端的文件地址 System.Diagnostics.Process.Start(clientfilePath);//打开本地文件 }