动态引用Webservice

 

Imports System.Collections.Generic
Imports System.Text
Imports System.IO
Imports System.Configuration
Imports System.CodeDom
Imports System.CodeDom.Compiler
Imports System.Net
Imports System.Web.Services
Imports System.Web.Services.Description
Imports Microsoft.CSharp

	Public NotInheritable Class WebServiceHelper
		Private Sub New()
		End Sub

		''' <summary>  
		''' 动态调用WebService  
		''' </summary>  
		''' <param name="url">WebService地址</param>  
		''' <param name="methodname">方法名(模块名)</param>  
		''' <param name="args">参数列表</param>  
		''' <returns>object</returns>  
		Public Shared Function InvokeWebService(url As String, methodname As String, args As Object()) As Object
			Return InvokeWebService(url, Nothing, methodname, args)
		End Function

		''' <summary>  
		''' 动态调用WebService  
		''' </summary>  
		''' <param name="url">WebService地址</param>  
		''' <param name="classname">类名</param>  
		''' <param name="methodname">方法名(模块名)</param>  
		''' <param name="args">参数列表</param>  
		''' <returns>object</returns>  
		Public Shared Function InvokeWebService(url As String, classname As String, methodname As String, args As Object()) As Object

			Dim [namespace] As String = "ServiceBase.WebService.DynamicWebLoad"

			If classname Is Nothing OrElse classname = "" Then

				classname = WebServiceHelper.GetClassName(url)
			End If

			'获取服务描述语言(WSDL)  
			Dim wc As New WebClient()
			Dim stream As Stream = wc.OpenRead(url & "?WSDL")
			Dim sd As ServiceDescription = ServiceDescription.Read(stream)
			Dim sdi As New ServiceDescriptionImporter()
			sdi.AddServiceDescription(sd, "", "")
			Dim cn As New CodeNamespace([namespace])
			'生成客户端代理类代码  
			Dim ccu As New CodeCompileUnit()
			ccu.Namespaces.Add(cn)
			sdi.Import(cn, ccu)
			Dim csc As New CSharpCodeProvider()
			Dim icc As ICodeCompiler = csc.CreateCompiler()
			'设定编译器的参数  
			Dim cplist As 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")

			'编译代理类  
			Dim cr As CompilerResults = icc.CompileAssemblyFromDom(cplist, ccu)
			If True = cr.Errors.HasErrors Then
				Dim sb As System.Text.StringBuilder = New StringBuilder()
				For Each ce As CompilerError In cr.Errors
					sb.Append(ce.ToString())
					sb.Append(System.Environment.NewLine)
				Next
				Throw New Exception(sb.ToString())
			End If

			'生成代理实例,并调用方法  
			Dim assembly As System.Reflection.Assembly = cr.CompiledAssembly
			Dim t As Type = assembly.[GetType]([namespace] & "." & classname, True, True)
			Dim obj As Object = Activator.CreateInstance(t)
			Dim mi As System.Reflection.MethodInfo = t.GetMethod(methodname)
			Return mi.Invoke(obj, args)
		End Function

		Private Shared Function GetClassName(url As String) As String
			Dim parts As String() = url.Split("/"C)
			Dim pps As String() = parts(parts.Length - 1).Split("."C)
			Return pps(0)
		End Function
	End Class

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值