加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

一个能动态调用webservice的类 (c#)

发布时间:2020-12-17 02:46:44 所属栏目:安全 来源:网络整理
导读:using System; using System.Reflection; using System.Web.Services.Description; using Microsoft.CSharp; using System.CodeDom; using System.CodeDom.Compiler; using System.IO; using System.Text; using System.Xml; using System.Net; /// summary

using System;
using System.Reflection;
using System.Web.Services.Description;
using Microsoft.CSharp;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.IO;
using System.Text;
using System.Xml;
using System.Net;

/// <summary>
/// WebServiceProxy 的摘要说明
/// </summary>
public class WebServiceProxy
{

??? private Assembly _ass = null;

?

??? private string _protocolName = "Soap";

??? private string _srcWSProxy = string.Empty;

?

??? public Assembly Assembly { get { return _ass; } }

?

??? public string ProtocolName

?

??? { get { return _protocolName; } set { _protocolName = value; } }

?

??? public string SrcWSProxy { get { return _srcWSProxy; } }

?

?

?

??? public WebServiceProxy()
??? {

?

??? }

?

??? public WebServiceProxy(string wsdlSourceName)
??? {

?

??????? AssemblyFromWsdl(GetWsdl(wsdlSourceName));

?

??? }

?

??? public string WsdlFromUrl(string url)
??? {

?

??????? WebRequest req = WebRequest.Create(url);

?

??????? WebResponse result = req.GetResponse();

?

??????? Stream ReceiveStream = result.GetResponseStream();

?

??????? Encoding encode = System.Text.Encoding.GetEncoding("utf-8");

?

??????? StreamReader sr = new StreamReader(ReceiveStream,encode);

?

??????? string strWsdl = sr.ReadToEnd();

?

??????? return strWsdl;

?

??? }

?

??? public string GetWsdl(string source)
??? {

?

??????? if (source.StartsWith("<?xml version") == true)
??????? {

??????????? return source;

??????? }

??????? else

?

??????????? if (source.StartsWith("http://") == true)
??????????? {

??????????????? return WsdlFromUrl(source);

??????????? }

?

??????? return WsdlFromFile(source);

??? }

??? public string WsdlFromFile(string fileFullPathName)
??? {

??????? FileInfo fi = new FileInfo(fileFullPathName);

??????? if (fi.Extension == "wsdl")
??????? {

??????????? FileStream fs = new FileStream(fileFullPathName,FileMode.Open,

??????????????? FileAccess.Read);

??????????? StreamReader sr = new StreamReader(fs);

??????????? char[] buffer = new char[(int)fs.Length];

??????????? sr.ReadBlock(buffer,(int)fs.Length);

??????????? return new string(buffer);

??????? }

?

??????? throw new Exception("This is no a wsdl file");

??? }

?

??? public Assembly AssemblyFromWsdl(string strWsdl)
??? {

??????? // Xml text reader

??????? StringReader wsdlStringReader = new StringReader(strWsdl);

??????? XmlTextReader tr = new XmlTextReader(wsdlStringReader);

??????? ServiceDescription sd = ServiceDescription.Read(tr);

??????? tr.Close();

?

??????? // WSDL service description importer

??????? CodeNamespace cns = new CodeNamespace("WebServiceProxy.WebServiceAccessor");

??????? ServiceDescriptionImporter sdi = new ServiceDescriptionImporter();

??????? sdi.AddServiceDescription(sd,null,null);

??????? sdi.ProtocolName = _protocolName;

??????? sdi.Import(cns,null);

?

??????? // source code generation

??????? CSharpCodeProvider cscp = new CSharpCodeProvider();

??????? ICodeGenerator icg = cscp.CreateGenerator();

??????? StringBuilder srcStringBuilder = new StringBuilder();

??????? StringWriter sw = new StringWriter(srcStringBuilder);

??????? icg.GenerateCodeFromNamespace(cns,sw,null);

??????? _srcWSProxy = srcStringBuilder.ToString();

??????? sw.Close();

?

??????? // assembly compilation.

??????? CompilerParameters cp = new CompilerParameters();

??????? cp.ReferencedAssemblies.Add("System.dll");

??????? cp.ReferencedAssemblies.Add("System.Xml.dll");

??????? cp.ReferencedAssemblies.Add("System.Web.Services.dll");

??????? cp.GenerateExecutable = false;

??????? cp.GenerateInMemory = true;

??????? cp.IncludeDebugInformation = false;

??????? ICodeCompiler icc = cscp.CreateCompiler();

??????? CompilerResults cr = icc.CompileAssemblyFromSource(cp,_srcWSProxy);

??????? if (cr.Errors.Count > 0)

??????????? throw new Exception(string.Format("Build failed: {0} errors",

??????????????? cr.Errors.Count));

?

??????? return _ass = cr.CompiledAssembly;

??? }

?

?

??? public object CreateInstance(string objTypeName)
??? {

??????? Type t = _ass.GetType("WebServiceProxy.WebServiceAccessor" + "." + objTypeName);

??????? return Activator.CreateInstance(t);

??? }

?

?

??? public object Invoke(object obj,string methodName,params object[] args)
??? {

??????? MethodInfo mi = obj.GetType().GetMethod(methodName);

??????? return mi.Invoke(obj,args);

??? }

}?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读