C#动态webservice调用接口

C#动态webservice调用接口

using System;
using System.Collections;
using System.IO;
using System.Net;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
namespace Hishop.Plugins
{
  /// <summary>
  /// 利用WebRequest/WebResponse进行WebService调用的类
  /// </summary>
  public class WebServiceCaller
  {
    #region Tip:使用说明
    //webServices 应该支持Get和Post调用,在web.config应该增加以下代码
    //<webServices>
    // <protocols>
    //  <add name="HttpGet"/>
    //  <add name="HttpPost"/>
    // </protocols>
    //</webServices>

    //调用示例:
    //Hashtable ht = new Hashtable(); //Hashtable 为webservice所需要的参数集
    //ht.Add("str", "test");
    //ht.Add("b", "true");
    //XmlDocument xx = WebSvcCaller.QuerySoapWebService("http://localhost:81/service.asmx", "HelloWorld", ht);
    //MessageBox.Show(xx.OuterXml);
    #endregion

    /// <summary>
    /// 需要WebService支持Post调用
    /// </summary>
    public static XmlDocument QueryPostWebService(String URL, String MethodName, Hashtable Pars)
    {
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName);
      request.Method = "POST";
      request.ContentType = "application/x-www-form-urlencoded";
      SetWebRequest(request);
      byte[] data = EncodePars(Pars);
      WriteRequestData(request, data);
      return ReadXmlResponse(request.GetResponse());
    }

    /// <summary>
    /// 需要WebService支持Get调用
    /// </summary>
    public static XmlDocument QueryGetWebService(String URL, String MethodName, Hashtable Pars)
    {
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL + "/" + MethodName + "?" + ParsToString(Pars));
      request.Method = "GET";
      request.ContentType = "application/x-www-form-urlencoded";
      SetWebRequest(request);
      return ReadXmlResponse(request.GetResponse());
    }

    /// <summary>
    /// 通用WebService调用(Soap),参数Pars为String类型的参数名、参数值
    /// </summary>
    public static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars)
    {
      if (_xmlNamespaces.ContainsKey(URL))
      {
        return QuerySoapWebService(URL, MethodName, Pars, _xmlNamespaces[URL].ToString());
      }
      else
      {
        return QuerySoapWebService(URL, MethodName, Pars, GetNamespace(URL));
      }
    }

    private static XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars, string XmlNs)
    {
      _xmlNamespaces[URL] = XmlNs;//加入缓存,提高效率
      HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
      request.Method = "POST";
      request.ContentType = "text/xml; charset=utf-8";
      request.Headers.Add("SOAPAction", "\"" + XmlNs + (XmlNs.EndsWith("/") ? "" : "/") + MethodName + "\"");
      SetWebRequest(request);
      byte[] data = EncodeParsToSoap(Pars, XmlNs, MethodName);
      WriteRequestData(request, data);
      XmlDocument doc = new XmlDocument(), doc2 = new XmlDocument();
      doc = ReadXmlResponse(request.GetResponse());

      XmlNamespaceManager mgr = new XmlNamespaceManager(doc.NameTable);
      mgr.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
      String RetXml = doc.SelectSingleNode("//soap:Body/*/*", mgr).InnerXml;
      doc2.LoadXml("<root>" + RetXml + "</root>");
      AddDelaration(doc2);
      return doc2;
    }
    private static string GetNamespace(String URL)
    {
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL + "?WSDL");
      SetWebRequest(request);
      WebResponse response = request.GetResponse();
      StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
      XmlDocument doc = new XmlDocument();
      doc.LoadXml(sr.ReadToEnd());
      sr.Close();
      return doc.SelectSingleNode("//@targetNamespace").Value;
    }

    private static byte[] EncodeParsToSoap(Hashtable Pars, String XmlNs, String MethodName)
    {
      XmlDocument doc = new XmlDocument();
      doc.LoadXml("<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"></soap:Envelope>");
      AddDelaration(doc);
      //XmlElement soapBody = doc.createElement_x_x("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
      XmlElement soapBody = doc.CreateElement("soap", "Body", "http://schemas.xmlsoap.org/soap/envelope/");
      //XmlElement soapMethod = doc.createElement_x_x(MethodName);
      XmlElement soapMethod = doc.CreateElement(MethodName);
      soapMethod.SetAttribute("xmlns", XmlNs);
      foreach (string k in Pars.Keys)
      {
        //XmlElement soapPar = doc.createElement_x_x(k);
        XmlElement soapPar = doc.CreateElement(k);
        soapPar.InnerXml = ObjectToSoapXml(Pars[k]);
        soapMethod.AppendChild(soapPar);
      }
      soapBody.AppendChild(soapMethod);
      doc.DocumentElement.AppendChild(soapBody);
      return Encoding.UTF8.GetBytes(doc.OuterXml);
    }
    private static string ObjectToSoapXml(object o)
    {
      XmlSerializer mySerializer = new XmlSerializer(o.GetType());
      MemoryStream ms = new MemoryStream();
      mySerializer.Serialize(ms, o);
      XmlDocument doc = new XmlDocument();
      doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray()));
      if (doc.DocumentElement != null)
      {
        return doc.DocumentElement.InnerXml;
      }
      else
      {
        return o.ToString();
      }
    }

    /// <summary>
    /// 设置凭证与超时时间
    /// </summary>
    /// <param name="request"></param>
    private static void SetWebRequest(HttpWebRequest request)
    {
      request.Credentials = CredentialCache.DefaultCredentials;
      request.Timeout = 10000;
    }

    private static void WriteRequestData(HttpWebRequest request, byte[] data)
    {
      request.ContentLength = data.Length;
      Stream writer = request.GetRequestStream();
      writer.Write(data, 0, data.Length);
      writer.Close();
    }

    private static byte[] EncodePars(Hashtable Pars)
    {
      return Encoding.UTF8.GetBytes(ParsToString(Pars));
    }

    private static String ParsToString(Hashtable Pars)
    {
      StringBuilder sb = new StringBuilder();
      foreach (string k in Pars.Keys)
      {
        if (sb.Length > 0)
        {
          sb.Append("&");
        }
        //sb.Append(HttpUtility.UrlEncode(k) + "=" + HttpUtility.UrlEncode(Pars[k].ToString()));
      }
      return sb.ToString();
    }

    private static XmlDocument ReadXmlResponse(WebResponse response)
    {
      StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
      String retXml = sr.ReadToEnd();
      sr.Close();
      XmlDocument doc = new XmlDocument();
      doc.LoadXml(retXml);
      return doc;
    }

    private static void AddDelaration(XmlDocument doc)
    {
      XmlDeclaration decl = doc.CreateXmlDeclaration("1.0", "utf-8", null);
      doc.InsertBefore(decl, doc.DocumentElement);
    }

    private static Hashtable _xmlNamespaces = new Hashtable();//缓存xmlNamespace,避免重复调用GetNamespace
  }
}
//调用并读取解析返回结果

 DataSet ds = new DataSet();
    XmlNode xmlNode1;
    XmlDataDocument xd = new XmlDataDocument();
    StringBuilder sb;
    Hashtable ht = new Hashtable();
    ht.Add("xmlIn", "<Request><MemCode>001</MemCode></Request>");
    xmlNode1 = Hishop.Plugins.WebServiceCaller.QuerySoapWebService("http://xxx.xxxx.com/Service.asmx", "SinPointQuery", ht);
    if (xmlNode1 == null)
    {
      return;
    }
    string xmlstr= HttpUtility.HtmlDecode(xmlNode1.OuterXml);
    sb = new StringBuilder(xmlstr);
    if (sb.ToString().Equals(""))
    {
      return;
    }
    xd.LoadXml(sb.ToString());
    ds.ReadXml(new XmlNodeReader(xd));
    //ds可以返回出结果集

示例二:

1.动态调用的方法:

/// <summary>
    /// 动态webservice调用
    /// </summary>
    /// <returns>string</returns>
    public string wsTest()
    {
      string url = "http://localhost:8080/myWebserviceTest/services/myServices?wsdl";//wsdl地址
      string name = "wsTest";//javaWebService开放的接口
      WebServiceProxy wsd = new WebServiceProxy(url, name); 

      string[] str = { "测试c#调用java的webService" , "Hello WebService"}; 

      string suc = (string)wsd.ExecuteQuery(name, str); 

      return suc;
    }

2.动态调用具体类:

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq; 

using System.IO;
using System.Net;
using System.CodeDom;
using System.CodeDom.Compiler;
using System.Web.Services.Description;
using System.Xml.Serialization;
using System.Web.Services.Discovery;
using System.Xml.Schema;
using System.Text;
using System.Security.Cryptography;
using System.Reflection;
using System.Collections.Generic;
using System.Xml; 

namespace TPSVService
{
  /// <summary>
  /// WebServiceProxy 的摘要说明
  /// </summary>
  [WebService(Namespace = "http://tempuri.org/")]
  [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
  [ToolboxItem(false)]
  // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
  // [System.Web.Script.Services.ScriptService]
  public class WebServiceProxy : System.Web.Services.WebService
  { 

    #region 私有变量和属性定义
    /// <summary>
    /// web服务地址
    /// </summary>
    private string _wsdlUrl = string.Empty;
    /// <summary>
    /// web服务名称
    /// </summary>
    private string _wsdlName = string.Empty;
    /// <summary>
    /// 代理类命名空间
    /// </summary>
    private string _wsdlNamespace = "FrameWork.WebService.DynamicWebServiceCalling.{0}";
    /// <summary>
    /// 代理类类型名称
    /// </summary>
    private Type _typeName = null;
    /// <summary>
    /// 程序集名称
    /// </summary>
    private string _assName = string.Empty;
    /// <summary>
    /// 代理类所在程序集路径
    /// </summary>
    private string _assPath = string.Empty;
    /// <summary>
    /// 代理类的实例
    /// </summary>
    private object _instance = null;
    /// <summary>
    /// 代理类的实例
    /// </summary>
    private object Instance
    {
      get
      {
        if (_instance == null)
        {
          _instance = Activator.CreateInstance(_typeName);
          return _instance;
        }
        else
          return _instance;
      }
    }
    #endregion 

    #region 构造函数
    public WebServiceProxy(string wsdlUrl)
    { 

      this._wsdlUrl = wsdlUrl;
      string wsdlName = WebServiceProxy.getWsclassName(wsdlUrl);
      this._wsdlName = wsdlName;
      this._assName = string.Format(_wsdlNamespace, wsdlName);
      this._assPath = Path.GetTempPath() + this._assName + getMd5Sum(this._wsdlUrl) + ".dll";
      this.CreateServiceAssembly();
    } 

    public WebServiceProxy(string wsdlUrl, string wsdlName)
    {
      this._wsdlUrl = wsdlUrl;
      this._wsdlName = wsdlName;
      this._assName = string.Format(_wsdlNamespace, wsdlName);
      this._assPath = Path.GetTempPath() + this._assName + getMd5Sum(this._wsdlUrl) + ".dll";
      this.CreateServiceAssembly();
    }
    #endregion 

    #region 得到WSDL信息,生成本地代理类并编译为DLL,构造函数调用,类生成时加载
    /// <summary>
    /// 得到WSDL信息,生成本地代理类并编译为DLL
    /// </summary>
    private void CreateServiceAssembly()
    {
      if (this.checkCache())
      {
        this.initTypeName();
        return;
      }
      if (string.IsNullOrEmpty(this._wsdlUrl))
      {
        return;
      }
      try
      {
        //使用WebClient下载WSDL信息
        WebClient web = new WebClient();
        Stream stream = web.OpenRead(this._wsdlUrl);
        ServiceDescription description = ServiceDescription.Read(stream);//创建和格式化WSDL文档
        ServiceDescriptionImporter importer = new ServiceDescriptionImporter();//创建客户端代理代理类
        importer.ProtocolName = "Soap";
        importer.Style = ServiceDescriptionImportStyle.Client; //生成客户端代理
        importer.CodeGenerationOptions = CodeGenerationOptions.GenerateProperties | CodeGenerationOptions.GenerateNewAsync;
        importer.AddServiceDescription(description, null, null);//添加WSDL文档
        //使用CodeDom编译客户端代理类
        CodeNamespace nmspace = new CodeNamespace(_assName);  //为代理类添加命名空间
        CodeCompileUnit unit = new CodeCompileUnit();
        unit.Namespaces.Add(nmspace);
        this.checkForImports(this._wsdlUrl, importer);
        ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit);
        CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
        CompilerParameters parameter = new CompilerParameters();
        parameter.ReferencedAssemblies.Add("System.dll");
        parameter.ReferencedAssemblies.Add("System.XML.dll");
        parameter.ReferencedAssemblies.Add("System.Web.Services.dll");
        parameter.ReferencedAssemblies.Add("System.Data.dll");
        parameter.GenerateExecutable = false;
        parameter.GenerateInMemory = false;
        parameter.IncludeDebugInformation = false;
        CompilerResults result = provider.CompileAssemblyFromDom(parameter, unit);
        provider.Dispose();
        if (result.Errors.HasErrors)
        {
          string errors = string.Format(@"编译错误:{0}错误!", result.Errors.Count);
          foreach (CompilerError error in result.Errors)
          {
            errors += error.ErrorText;
          }
          throw new Exception(errors);
        }
        this.copyTempAssembly(result.PathToAssembly);
        this.initTypeName();
      }
      catch (Exception e)
      {
        throw new Exception(e.Message);
      }
    }
    #endregion 

    #region 执行Web服务方法
    /// <summary>
    /// 执行代理类指定方法,有返回值
    /// </summary>
    /// <param  name="methodName">方法名称</param>
    /// <param  name="param">参数</param>
    /// <returns>object</returns>
    public object ExecuteQuery(string methodName, object[] param)
    {
      object rtnObj = null;
      string[] args = new string[2];
      List<string> list = new List<string>();
      List<string> list1 = new List<string>();
      List<string> list2 = new List<string>();
      object[] obj = new object[3]; 

      try
      {
        if (this._typeName == null)
        {
          //记录Web服务访问类名错误日志代码位置
          throw new TypeLoadException("Web服务访问类名【" + this._wsdlName + "】不正确,请检查!");
        }
        //调用方法
        MethodInfo mi = this._typeName.GetMethod(methodName);
        if (mi == null)
        {
          //记录Web服务方法名错误日志代码位置
          throw new TypeLoadException("Web服务访问方法名【" + methodName + "】不正确,请检查!");
        }
        try
        {
          if (param == null)
            rtnObj = mi.Invoke(Instance, null);
          else {
            list.Add("Hello ");
            list.Add("WebService ");
            list.Add(" ! "); 

            list1.Add("I ");
            list1.Add("am ");
            list1.Add("test "); 

            list2.Add("do ");
            list2.Add("it ");
            list2.Add("now "); 

            obj[0] = list;
            obj[1] = list1;
            obj[2] = list2; 

            rtnObj = mi.Invoke(Instance, new object[] { obj });
            //rtnObj = mi.Invoke(Instance, new object[] { param });
          }
        }
        catch (TypeLoadException tle)
        {
          //记录Web服务方法参数个数错误日志代码位置
          throw new TypeLoadException("Web服务访问方法【" + methodName + "】参数个数不正确,请检查!", new TypeLoadException(tle.StackTrace));
        }
      }
      catch (Exception ex)
      {
        throw new Exception(ex.Message, new Exception(ex.StackTrace));
      }
      return rtnObj;
    } 

    /// <summary>
    /// 执行代理类指定方法,无返回值
    /// </summary>
    /// <param  name="methodName">方法名称</param>
    /// <param  name="param">参数</param>
    public void ExecuteNoQuery(string methodName, object[] param)
    {
      try
      {
        if (this._typeName == null)
        {
          //记录Web服务访问类名错误日志代码位置
          throw new TypeLoadException("Web服务访问类名【" + this._wsdlName + "】不正确,请检查!");
        }
        //调用方法
        MethodInfo mi = this._typeName.GetMethod(methodName);
        if (mi == null)
        {
          //记录Web服务方法名错误日志代码位置
          throw new TypeLoadException("Web服务访问方法名【" + methodName + "】不正确,请检查!");
        }
        try
        {
          if (param == null)
            mi.Invoke(Instance, null);
          else
            mi.Invoke(Instance, param);
        }
        catch (TypeLoadException tle)
        {
          //记录Web服务方法参数个数错误日志代码位置
          throw new TypeLoadException("Web服务访问方法【" + methodName + "】参数个数不正确,请检查!", new TypeLoadException(tle.StackTrace));
        }
      }
      catch (Exception ex)
      {
        throw new Exception(ex.Message, new Exception(ex.StackTrace));
      }
    }
    #endregion 

    #region 私有方法
    /// <summary>
    /// 得到代理类类型名称
    /// </summary>
    private void initTypeName()
    {
      Assembly serviceAsm = Assembly.LoadFrom(this._assPath);
      Type[] types = serviceAsm.GetTypes();
      string objTypeName = "";
      foreach (Type t in types)
      {
        if (t.BaseType == typeof(SoapHttpClientProtocol))
        {
          objTypeName = t.Name;
          break;
        }
      }
      _typeName = serviceAsm.GetType(this._assName + "." + objTypeName);
    } 

    /// <summary>
    /// 根据web  service文档架构向代理类添加ServiceDescription和XmlSchema
    /// </summary>
    /// <param  name="baseWSDLUrl">web服务地址</param>
    /// <param  name="importer">代理类</param>
    private void checkForImports(string baseWsdlUrl, ServiceDescriptionImporter importer)
    {
      DiscoveryClientProtocol dcp = new DiscoveryClientProtocol();
      dcp.DiscoverAny(baseWsdlUrl);
      dcp.ResolveAll();
      foreach (object osd in dcp.Documents.Values)
      {
        if (osd is ServiceDescription) importer.AddServiceDescription((ServiceDescription)osd, null, null); ;
        if (osd is XmlSchema) importer.Schemas.Add((XmlSchema)osd);
      }
    } 

    /// <summary>
    /// 复制程序集到指定路径
    /// </summary>
    /// <param  name="pathToAssembly">程序集路径</param>
    private void copyTempAssembly(string pathToAssembly)
    {
      File.Copy(pathToAssembly, this._assPath);
    } 

    private string getMd5Sum(string str)
    {
      Encoder enc = System.Text.Encoding.Unicode.GetEncoder();
      byte[] unicodeText = new byte[str.Length * 2];
      enc.GetBytes(str.ToCharArray(), 0, str.Length, unicodeText, 0, true);
      MD5 md5 = new MD5CryptoServiceProvider();
      byte[] result = md5.ComputeHash(unicodeText);
      StringBuilder sb = new StringBuilder();
      for (int i = 0; i < result.Length; i++)
      {
        sb.Append(result[i].ToString("X2"));
      }
      return sb.ToString();
    } 

    /// <summary>
    /// 是否已经存在该程序集
    /// </summary>
    /// <returns>false:不存在该程序集,true:已经存在该程序集</returns>
    private bool checkCache()
    {
      if (File.Exists(this._assPath))
      {
        return true;
      }
      return false;
    } 

    //私有方法,默认取url入口的文件名为类名
    private static string getWsclassName(string wsdlUrl)
    {
      string[] parts = wsdlUrl.Split('/');
      string[] pps = parts[parts.Length - 1].Split('.');
      return pps[0];
    }
    #endregion
  }
}

以上所述就是本文的全部内容了,希望大家能够喜欢。

(0)

相关推荐

  • C# WebService发布以及IIS发布

    首先我们要做的就是先把IIS(Internet信息服务)打开,我用的是win8 的系统,所以这里以win8系统的操作来讲 一.IIS的一些事先操作 1.打开控制面板,然后进入程序 2.进入程序以后我们找到 启用或关闭Windows功能 3.进入以后把  Internet信息服务  的都选上,单击"确定" 上述的步骤好了以后我们退回到控制面板  ,找到   系统和安全 里面的  管理工具     点击"管理工具"    ,第一个就是我们的IIS了,双击打开它 我们会弹

  • C#发送HttpPost请求来调用WebService的方法

    复制代码 代码如下: void UpdateContactSign()        {           string ServerPage ="http://localhost/WebService/MyService.asmx";            try            {                //ServerPage += "?op=TangramAction";                ServerPage += "

  • c#编写webservice服务引用实例分享

    首先在新建了一个web服务文件. 复制代码 代码如下: public  SqlWhhWebService1()        {            InitializeComponent();        }        #region Component Designer generated code //Required by the Web Services Designer         private IContainer components = null; /// <su

  • asp.net(c#)动态修改webservice的地址和端口(动态修改配置文件)

    这个问题其实并没有我想像的那个复杂,我们都知道怎么直接修改吧,那就是修改WebConfig文件的配置节具体的方法看下面图片 这个相信很多人都知道,直接修改就行了动态修改方式----------------------------------------------------------那么怎么动态修改呢?我想可能很多人都会这样讲,修改WebConfig文件,有专用的帮助类,也可以自己写因为WebConfig是可以Xml的形来编辑的,对的这种方法确实是可行的那么我告诉你们,你们错了,有更简单而且

  • c#动态调用Webservice的两种方法实例

    方法一: 复制代码 代码如下: Hashtable ht = new Hashtable();            ht.Add("a", "testhelloworld");            XmlDocument xx = WebServicesHelper.QuerySoapWebService("http://www.jb51.net/elab_mgmt/WorkflowSchemeTaskSerivce.asmx", "

  • C# .Net动态调用webService实现思路及代码

    复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Net; using System.IO; using System.Web.Services.Description; using System.CodeDom; using Microsoft.CSharp; using System.CodeDom.Compiler; usi

  • c#动态改变webservice的url访问地址

    1.添加一个App.config配置文件. 2.配置服务http://Lenovo-PC:80/EvisaWS/WharfService?wsdl,那么在上面的文件中就会自动生成服务的配置: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8" ?><configuration>    <system.serviceModel>        <bindings>       

  • C#调用和实现WebService,纯手工打造!

    先为啥要纯手工打造呢,因为对方是用C++做的,我按照他们给出的WSDL实现了一个WebService,结果他们完全不能调用.具体是他们调用的问题还是WSDL定义的问题,不可考了. 悲催的弱势方--只能我们去配合他们.不提了. 首先用C#调用对方的WebService.因为对方用的C++实现,添加Web服务引用方式无效--直接添加WSDL的调用对方不认-- 只好手工打造,还好C#足够强大. HttpWebRequest类可以简单的实现WebService调用. 首先手工打造SOAP包内容 复制代码

  • C#调用WebService实例开发

    一.基本概念 Web Service也叫XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.是:通过SOAP在Web上提供的软件服务,使用WSDL文件进行说明,并通过UDDI进行注册.简单的理解就是:webservice 就是放在服务器上的函数,所有人都可以调用,然后返回信息. 比如google就有一个web service ,你调用它就可以很容易的做一个搜索网站. 就像调用函数一样,传入若

  • C#使用HttpPost请求调用WebService的方法

    之前调用 WebService 都是直接添加服务引用,然后调用 WebService 方法的,最近发现还可以使用 Http 请求调用 WebService.这里还想说一句,还是 web api 的调用简单. WebService 服务端代码: public class WebServiceDemo : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"

随机推荐