<client>
            <endpoint address="http://localhost:1002/FileCenter/Document_Service.asmx"
                binding="basicHttpBinding" bindingConfiguration="Document_ServiceSoap"
                contract="FileServer_Service.Document_ServiceSoap" name="Document_ServiceSoap" />
        </client>
想把Address那个属性变成动态赋值的
怎么弄??

解决方案 »

  1.   

    我教你动态去调用WS吧。using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Net;
    using System.IO;
    using System.Web.Services.Description;
    using System.CodeDom;
    using Microsoft.CSharp;
    using System.CodeDom.Compiler;
    using System.Reflection;
    namespace WebServicesHelp
    {
        /// <summary>
        /// 调用传统的WebService
        /// Add by Dylan 
        /// Date 2012/03/08
        /// </summary>
        public class InvokeWebService
        {
            /// <summary>
            /// 调用传统webservice(不知道类名)
            /// </summary>
            /// <param name="url">服务地址</param>
            /// <param name="methodName">方法名</param>
            /// <param name="args">方法参数</param>
            /// <returns></returns>
            public static object InvokeWS(string url, string methodName, object[] args)
            {
                return InvokeWS(url, null, methodName, args);
            }
            /// <summary>
            /// 
            /// </summary>
            /// <param name="url">服务地址</param>
            /// <param name="calssName">类名</param>
            /// <param name="methodName">服务地址</param>
            /// <param name="args">方法参数</param>
            /// <returns></returns>
            public static object InvokeWS(string url, object calssName, string methodName, object[] args)
            {
                string namespaceStr = "WebServicesHelp";//WebServicesHelp
                if (calssName == null )
                {
                    calssName = InvokeWebService.GetWsClassName(url);
                }            try
                {
                    //获取WSDL
                    WebClient wc = new WebClient();
                    Stream stream = wc.OpenRead(url + "?WSDL");//例如:http://www.webxml.com.cn/WebServices/ChinaStockWebService.asmx?wsdl
                    ServiceDescription sd = ServiceDescription.Read(stream);//读取服务描述
                    #region 摘自MSDN
                    //使用 ServiceDescriptionImporter 类可以方便地将 WSDL 说明中包含的信息导入到 System.CodeDom.CodeCompileUnit 对象
                    //通过调整 Style 参数的值,可以指示 ServiceDescriptionImporter 实例生成客户端代理类
                    //(通过透明调用该类可提供 Web 服务的功能)或生成抽象类(该类封装 Web 服务的功能而不实现该功能)。
                    //然后可直接调用或以选择的语言导出生成的 CodeCompileUnit 对象中的代码。
                    #endregion
                    ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();
                    sdi.AddServiceDescription(sd, "", "");
                    CodeNamespace cn = new CodeNamespace(namespaceStr);                //动态生成客户端代理类代码
                    CodeCompileUnit ccu = new CodeCompileUnit();
                    ccu.Namespaces.Add(cn);
                    sdi.Import(cn, ccu);
                    CSharpCodeProvider csc = new CSharpCodeProvider();//提供对 C# 代码生成器和代码编译器的实例的访问。
                    //ICodeCompiler icc = csc.CreateCompiler();//ICodeCompiler接口在.NET 2.0中就过时了
                   
                    //设定编译参数
                    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);//.NET 2.0就过时了
                    CompilerResults cr = csc.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());
                    }                //生成代理实例,并使用反射调用方法
                    Assembly assembly = cr.CompiledAssembly;
                    Type[] types = assembly.GetTypes();//获取该程序集中所有的类型(方便异常调试时候检查)
                    Type t = assembly.GetType(namespaceStr + "." + calssName);
                    MethodInfo[] methodInfo = t.GetMethods();//获取该类包含的所有方法信息(方便异常调试时候检查)
                    object obj = Activator.CreateInstance(t);//获取实例
                    MethodInfo mi = t.GetMethod(methodName);
                    return mi.Invoke(obj, args);//调用实例方法,返回结果
                    //object obj = assembly.CreateInstance(namespaceStr + "." + calssName);//必须使用名称空间+类名称 --获得对象实例
                    //result = (string)mi.Invoke(obj, args);//调用实例方法
                   // result = (string)mi.Invoke(null, args);//静态方法          
                    //return result;
                }
                catch (Exception ex)
                {
                    //写日志 ......
                   // throw new Exception(ex.InnerException.Message, new Exception(ex.InnerException.StackTrace));
                    throw new Exception(ex.Message);
                }
            }
            /// <summary>
            /// 根据web服务公开的URL地址,获取“类名”
            /// </summary>
            /// <param name="wsUrl">http://webservice.webxml.com.cn/WebServices/MobileCodeWS.asmx?op=getDatabaseInfo</param>
            /// <returns>"MobileCodeWS"</returns>
            private static string GetWsClassName(string wsUrl)
            {
                string[] parts = wsUrl.Split('/');
                string[] pps = parts[parts.Length - 1].Split('.');            return pps[0];
            }
        }
    }