首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web Service >

C#动态调用webservice解决办法

2012-12-18 
C#动态调用webservice哪位大侠有动态调用webservice的例子,给我参考一下看看[最优解释]http://wenku.baidu

C#动态调用webservice
哪位大侠有动态调用webservice的例子,给我参考一下看看
[最优解释]
http://wenku.baidu.com/view/c9e58b204b35eefdc8d3333c.html

我用过反射的
[其他解释]
不到万不得已,不要动不动就“动态”,避免使用“反射”。
[其他解释]
动态什么概念呀,如果是想连到不同的url上,通过使用配置文件类似的方法提供url就可以了。
[其他解释]
LZ的意思是不用工具生成代理直接调用?这是可以做到的。用ChannelFactory<T>的泛型就可以了。
因为代理也无非帮你根据这个泛型类生成一堆代码而已。但是前提是服务端定义的接口T你要事先知道。

[其他解释]
动态 在项目里面引用了wenservice地址 之后,默认是动态的。去属性看看,是不是动态的。
[其他解释]
其实就是怕引用地址改变,想自己设置webservice的地址,在网上找了好些代码都是用的反射,但我把地址改变之后发现还是没用,不知道是不是我哪里写错了

2楼说的是我也试过了,改配置文件也没有用,
[其他解释]
如果web service的wsdl都完全一样,不必添加所有web references,添加任意一个,生成代理类后,动态改变url即可:

MyProxyClass client = new MyProxyClass();
client.Url = "http://abc.com/a.asmx";

根据自己的要求动态设置URL的请求地址
[其他解释]
到百度搜索下载就好了
[其他解释]
7楼正解
[其他解释]

引用:
其实就是怕引用地址改变,想自己设置webservice的地址,在网上找了好些代码都是用的反射,但我把地址改变之后发现还是没用,不知道是不是我哪里写错了

2楼说的是我也试过了,改配置文件也没有用,


只是改地址的话,在配置文件里直接可以修改啊。
[其他解释]
引用  WebServiceHelper.cs
具体内容在下一个帖子


调用的方法
           HelloWorld   为调用服务所提供的方法
           args         方法的参数列表
           urlServices  所要调用服务的URL
           
                  object[] args = new object[3];
                  args[0] = postArray;
                  args[1] = Savepath;
                  args[2] = NewFileName;
                  string urlServices = "http://172.16.4.112:8080/Service.asmx";
                  object obj = WebServiceHelper.InvokeWebService(urlServices, "HelloWorld", args);
[其他解释]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.Services.Description;
using System.CodeDom;
using Microsoft.CSharp;
using System.CodeDom.Compiler;


using System.IO;
using System.Net;


namespace ResumeImport
{

    public class WebServiceHelper
    {
        private WebServiceHelper()
        {
        }

        #region InvokeWebService
        //动态调用web服务
        public static object InvokeWebService(string url, string methodname, object[] args)
        {

            return WebServiceHelper.InvokeWebService(url, null, methodname, args);
        }

        public static object InvokeWebService(string url, string classname, string methodname, object[] args)
        {
            string @namespace = "EnterpriseServerBase.WebService.DynamicWebCalling";
            if ((classname == null) 
[其他解释]
 (classname == ""))
            {
                classname = WebServiceHelper.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

    }
}

[其他解释]
上面的方法我用过,如果LZ有什么问题,可以发邮件给我
[其他解释]
请看我这篇文章:
http://blog.csdn.net/haukwong/article/details/7023039

有任何问题可以和我联系。

热点排行