动态调用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 = "http://localhost:3182/Service1.asmx?WSDL";//这个地址可以写在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);
}