基于WebService的C#程序与C#程序之间的方法调用

版权声明:本文为博主原创文章,如果转载,请注明出处,谢谢。 https://blog.csdn.net/u013719339/article/details/83340529

一、Web Service

Web Service是应用程序组件,使用开放协议进行通信,它是独立的,并且可自我描述,可通过UDDI来发现,可被其他应用程序使用。

XML是Web Service的基础,基础的Web Service平台是XML+HTTP,前者提供了一种可用于不同的平台和编程语言之间的语言,后者是最常用的因特网协议。

Web Service平台的元素有:SOAP(简单对象访问协议)、UDDI(通用描述、发现及整合)、WSDL(Web Service描述语言)。Web Service平台是简单的可共同操作的消息收发框架,缺少许多诸如安全和路由等重要的特性,但只要SOAP变得高级,这些问题就会得到解决。

SOAP指简单对象访问协议,是一种通信协议,是一种用于发送信息的格式,被设计用来通过因特网进行通信,用于应用程序之间的通信,它基于XML,独立于平台和语言,它很简单,并且可扩展,允许绕过防火墙。

WSDL是基于XML的用于描述Web Service以及如何访问Web Service的语言,即WSDL指网络服务描述语言,使用XML编写,是一种XML文档,用于描述网络服务,也可用于定位网络服务。

UDDI是一种目录服务,通过它,企业可注册并搜索Web Service。UDDI指通用的描述、发现以及整合,是一种用于存储有关Web Service的信息的目录,是一种由WSDL描述的网络服务接口目录,它被构建与Microsoft.NET平台之中,经由SOAP进行通讯。

二、建立两个Web项目

1、建立web空项目

文件——新建——项目:Visual C#——Web——ASP.NET Web应用程序——空 

2、添加web服务

右键项目名称——添加——新建项:web服务

看到的界面为:

3、调试

点击工具栏里的浏览器进行调试,可以看到第一个helloword()的运行结果: 

4、根据这个步骤建立两个WebService,分别为WebService1和WebService2。此处为两个WebService添加不同的方法以便更好地区分。

//WebService1

        [WebMethod(Description = "求和方法")]
        public int Sum(int a, int b)
        {
            int sum = a + b;
            return sum;
        }

//WebService2

        [WebMethod(Description = "求积方法")]
        public int Product(int a, int b)
        {
            int product = a * b;
            return product;
        }

WebService1:发布后链接:http://localhost:49954/WebService1.asmx

WebService2:发布后链接:http://localhost:64862/WebService2.asmx

三、WebService1调用WebService2:固定链接

1、方法一:添加Web引用

1)添加Web引用

在WebService1中:右键引用——添加服务引用——高级——添加Web引用——url:输入WebService2发布后的链接——转到——添加引用。

在输入WebService2发布后的链接并点击转到按钮后,可看到出现了WebService2的网页界面;在添加引用按钮上面,有一个Web引用名,默认为localhost,在代码中会用到,一般最好修改为其它名字;点击添加引用后,可以看到解决方案管理器里引用下面多了Web References。

此时Web.config里增加了相关配置代码:

  <applicationSettings>
    <WebApplication1.Properties.Settings>
      <setting name="WebApplication1_localhost_WebService2" serializeAs="String">
        <value>http://localhost:64862/WebService2.asmx</value>
      </setting>
    </WebApplication1.Properties.Settings>
  </applicationSettings>

2)在WebService1中调用WebService2的Product()函数:

        [WebMethod]
        public int WebService(int a, int b)
        {
            localhost.WebService2 webService = new localhost.WebService2(); //localhost为上面添加引用时Web引用名的默认值,最好修改为其它
            int count = webService.Product(a, b);
            return count;
        }

然后运行:默认以xml格式显示结果

2、方法二:添加服务引用

1)在WebService1中:右键引用——添加服务引用——在地址中输入WebService2的链接——转到——确定。

点击转到后,服务中出现WebService2,点击它,出现WebService2Soap,再点击它,操作中出现WebSercvice的两个函数。一般默认命名空间为ServiceReference1,与上面的localhost是一个作用,最好修改它。点击确定后,引用里多了下图的两个引用。

此时Web.config里增加了相关配置代码:

  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="WebService2Soap" />
      </basicHttpBinding>
    </bindings>
    <client>
      <endpoint address="http://localhost:64862/WebService2.asmx" binding="basicHttpBinding"
        bindingConfiguration="WebService2Soap" contract="ServiceReference1.WebService2Soap"
        name="WebService2Soap" />
    </client>
  </system.serviceModel>

2)在WebService1中调用WebService2的Product()函数:

        [WebMethod]
        public int WebService()
        {
            ServiceReference1.WebService2SoapClient webservice = new ServiceReference1.WebService2SoapClient(); //ServiceReference1为添加服务引用的命名空间
            int count = webservice.Product(2, 3);
            return count;
        }

四、WebService1调用WebService2:动态链接

1、以参数形式表示服务引用的链接

本地调试时一般为固定地址,当需要发布或迁移时,最好就要使用动态链接调用了。

此处使用上面的第二种方法进行动态调用。先在WebService2SoapClient上右键——转到定义,查看WebService2SoapClient提供的方法,可以看到它可以接受两个参数:服务引用的名称、服务引用的链接。

在Web.config中找到服务引用的名字:name="WebService2Soap",将WebService2的端口改为60713,修改上面的代码:

        [WebMethod]
        public int WebService()
        {
            ServiceReference1.WebService2SoapClient webservice = new ServiceReference1.WebService2SoapClient("WebService2Soap", "http://localhost:60713/WebService1.asmx");
            int count = webservice.Product(2, 4);
            return count;
        }

当需要随时动态修改链接时,将参数2服务引用的链接写到程序的配置文件里,此处改为一个变量,然后用变量去读取配置文件里的连接。

2、配置文件

1)在WebService1项目的bin目录下创建一个config.xml文件(打开文件夹,在文件夹中新建,工程目录会自动显示它),可做如下编写:

<config>
  <webservice_path>
    <value>http://localhost:60713/WebService1.asmx</value>
  </webservice_path>
</config>

2)右键项目名称——添加——新建项:全局应用程序类Global.asax: 

3)在Global.asax的Application_Start()中读取配置文件信息:

using System.Xml;
using System.IO;

protected void Application_Start(object sender, EventArgs e)
{
       XmlDocument configXml = new XmlDocument();
       string strPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "bin", "config.xml");// 上面新建的"config.xml";
       if (File.Exists(strPath))
       {
           //加载xml文件并且读取文件根节点(每个xml文件有且仅有一个根节点)
           configXml.Load(strPath);
           XmlNode root = configXml.SelectSingleNode("config");
           //读取config.xml文件里的webservice_path
           XmlNodeList webservice_path= root.SelectNodes("webservice_path");
           string abc = ((XmlElement)webservice_path.Item(0)).ChildNodes.Item(0).InnerText;
       }
}

4)对于配置文件config.xml来说,文件的内容是随时可变的,属于动态变量。但是对于C#工程来说,它读取的永远都是config.xml的节点,节点名是不变的,它是静态变量。也即是只要程序运行,Global.asax里读取的值就不会改变,程序里引用的这个对应值不会改变。如果要改变程序里的值,只有停止程序,修改后重新运行才会成功。

为了使结构清晰,新建一个类Config.cs,在类中定义静态变量,作为程序在运行时的变量名。这样,读取配置文件的结构就是:config.xml(可随时修改的配置文件)——Global.asax(读取配置文件的值)——Config.cs定义值对应的变量名,以供程序使用。config.xml和Config.cs的名字可以修改,Global.asax最好不要修改。 

因此根据上面的例子,就需要添加一个类Config.class替代上面的变量abc:右键项目名称——添加——类,将类名设为Config.cs,在其中设置读取config.xml的静态变量,一般把该变量名设置为与xml文件中相同:

namespace WebApplication1
{
    public class Config
    {
        public static string webservice_path;
    }
}

修改第3步中最后一句代码,用上面定义的静态变量webservice_path替换其中定义的字符串abc

 //把string abc 改为已经定义好的变量Config.webservice_path
Config.webservice_path = ((XmlElement)webservice_path.Item(0)).ChildNodes.Item(0).InnerText;

在其他地方需要使用webservice_path时直接就使用Config.webservice_path即可。 

需要注意的是,引用类时必须是在相同的命名空间下,如果是不同的命名空间,需要使用“using namespace”引用命名空间,或者使用“命名空间.类名.函数名/方法名/变量名”来引用其他命名空间的方法。

3、把VS界面显示在WebService1.asmx上,运行程序即可。

当需要修改链接时,直接修改xml里的内容即可。

当配置文件里原本是WebService2的链接时,修改链接,有两种情况:

1)依旧调用WebService2,配置文件里写WebService2的新链接;

2)调用其他WebService,配置文件里写其他WebService的链接,如WebService3,但由于在链接下面跟着的代码是WebService2中的函数,因此如果WebService3中没有该函数,代码会报错,而如果有该函数,则调用的是WebService3中的函数。

猜你喜欢

转载自blog.csdn.net/u013719339/article/details/83340529