c#动态调用WebService

动态调用webservice时 ServiceDescriptionImporter类在vs2010无法引用的解决方法 .
[导读]ServiceDescriptionImporter是创建Web Service 时使用的类,它是引用继承System.Web.Services

   当我将VS2005里写的一段代码放在VS2010里时,发现引用出现错误标志.代码如下:
           '// 3. 创建客户端代理代理类。
            ServiceDescriptionImporter importer = new ServiceDescriptionImporter();        //VC
            Dim importer As ServiceDescriptionImporter = New ServiceDescriptionImporter()  //VB

   检查原因,我已经添加了System.Web.Service,问题仍未解决,检查.net 引用 是使用 .net 4.0 framework client profile
将它改成 .net 4.0 framework,问题终于解决.
   原来在创建VS2010项目时,系统默认是 .net 4.0 framework client profile,我们应该将它改成 .net 4.0 framework,设置方法:


鼠标右击项目---->选择属性(Properties)---->应用程序----->修改目标框架(Target framework)          这里指的是winform程序

===========================封装的类=====================================================
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Collections;
using System.Web;
using System.Net;
using System.Reflection;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Web.Services;
using System.Text;
using System.Web.Services.Description;
using System.Web.Services.Protocols;
using System.Xml.Serialization;
using System.Windows.Forms;

namespace TestWebService
{
    public static class InvokeWebServiceDynamic
    {
        public static object InvokeWebMethod(string _url ,string _methodName,
                                params object[] _params)
        {
            WebClient client = new WebClient();
            //String url = "这个地址可以写在Config文件里面
            Stream stream = client.OpenRead(_url);
            ServiceDescription description = ServiceDescription.Read(stream);

            ServiceDescriptionImporter importer = new ServiceDescriptionImporter();//创建客户端代理代理类。
            importer.ProtocolName = "Soap"; //指定访问协议。
            importer.Style = ServiceDescriptionImportStyle.Client; //生成客户端代理。
            importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties |
                CodeGenerationOptions.GenerateNewAsync;
            importer.AddServiceDescription(description, null, null); //添加WSDL文档。
            CodeNamespace nmspace = new CodeNamespace(); //命名空间
            nmspace.Name = "CITI_WS_InWH1";      //这个命名空间可以自己取
            CodeCompileUnit unit = new CodeCompileUnit();
            unit.Namespaces.Add(nmspace);
            ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
            CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
            CompilerParameters parameter = new CompilerParameters();
            parameter.GenerateExecutable = false;
            parameter.OutputAssembly = "MyTest.dll";//输出程序集的名称
            parameter.ReferencedAssemblies.Add("System.dll");
            parameter.ReferencedAssemblies.Add("System.XML.dll");
            parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
            parameter.ReferencedAssemblies.Add("System.Data.dll");
            CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
            if (result.Errors.HasErrors)            
            {                
                // 显示编译错误信息            
            }
            Assembly asm = Assembly.LoadFrom("MyTest.dll");//加载前面生成的程序集
            Type t = asm.GetType("CITI_WS_InWH1.wsTransData_InWH"); //前面的命名空间.类名,类必须是webservice中定义的
            object o = Activator.CreateInstance(t);
            MethodInfo method = t.GetMethod(_methodName);//GetPersons是服务端的方法名称,你想调用服务端的什么方法都可以在这里改,最好封装一下
            object item = method.Invoke(o, _params); //注:method.Invoke(o, null)返回的是一个Object,如果你服务端返回的是DataSet,这里也是用(DataSet)method.Invoke(o, null)转一下就行了
            //foreach (string str in item)
            //    Console.WriteLine(str);               //上面是根据WebService地址,模似生成一个代理类,如果你想看看生成的代码文件是什么样子,可以用以下代码保存下来,默认是保存在bin目录下面
            //TextWriter writer = File.CreateText("MyTest.cs");
            //provider.GenerateCodeFromCompileUnit(unit, writer, null);
            //writer.Flush();
            //writer.Close();
            return item;
        }
    }
}
===========================调用的代码==================================================
        private void btnInvokeDynamic_Click(object sender, EventArgs e)
        {
            //要注意加?WSDL
            //string _url = "

http://localhost:58764/wsTransData_InWH.asmx?WSDL";
            string _url = "http://192.128.58.248/CITI_TRANS_WH/wsTransData_InWH.asmx?WSDL";
            string _get = InvokeWebServiceDynamic.InvokeWebMethod(_url, "HelloWorld",
                            new object[] { "测试" }).ToString();
            MessageBox.Show(_get);
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值