WCF的Clinet和Service

WCF:创建一个服务端,实现逻辑在服务端上。然后创建一个客户端来调用服务端中的接口实现类,达到需求。

配置写在代码内部

Service服务端

新建个控制台项目
在这里插入图片描述
需要添加一个对应的引用
在这里插入图片描述
服务端的代码如下:

namespace WCFService
{
    class Program
    {
        static void Main(string[] args)
        {
            //设置WCF的一个服务端地址
            Uri baseAddress = new Uri("http://localhost:8000/WCFService");

            //ServiceHost 类用于托管 WCF服务。提供了一个运行时环境,用于启动、管理和关闭 WCF 服务
            //typeof(HelloWCFService) 指定了服务实现类
            //baseAddress 指定了服务的基地址。
            ServiceHost host = new ServiceHost(typeof(HelloWCFService), baseAddress);

            //AddServiceEndpoint 方法为服务添加端点。端点定义了服务的地址、绑定和契约。
            host.AddServiceEndpoint(typeof(IHelloWorldService), new WSHttpBinding(), "HelloWCFService");

            //通过添加 ServiceMetadataBehavior,启用 HTTP GET 方式访问服务元数据(WSDL)。
            //这允许客户端通过 http://localhost:8000/WCFService?wsdl 获取服务的 WSDL 文件。
            ServiceMetadataBehavior smb = new ServiceMetadataBehavior();

            //true:客户端可用HTTP GET的方法从服务端下载元数据
            smb.HttpGetEnabled = true;

            //服务元数据行为对象添加到宿主ServiceHost 对象的行为集合中去
            host.Description.Behaviors.Add(smb);

            //启动服务。
            host.Open();

            Console.WriteLine("WCFService is Ready.........");
           
            Console.ReadLine();

            //关闭服务。
            host.Close();
        }
    }
            //标记为 [ServiceContract] 属性的接口都表示该接口是一个服务协定
            [ServiceContract]
            interface IHelloWorldService
            {
                //标记为 [OperationContract] 属性的方法都表示该方法是一个操作协定
                [OperationContract]
                string HelloWorld();
            }

            //创建了服务协定后,要写一个类去实现它,让这个服务有实体,这个实体是它逻辑真正存在的地方
            public class HelloWorldService : IHelloWorldService
            {
                public string HelloWorld()
                {
                    return "Hello World!";
                }
            }            
}

在这里插入图片描述
在这里插入图片描述

然后运行下服务端程序
在这里插入图片描述
打开浏览器输入对应的网址,如下显示就是可以了
在这里插入图片描述

Client客户端

新建个WCFClient的控制台文件
在这里插入图片描述
右键项目增加个引用,把我们服务端的网址引用进来
在这里插入图片描述
在引用的时候需要先把服务端启动起来,从编译的文件这边启动,开发环境那个留着启动客户端的程序。
在这里插入图片描述
在这里插入图片描述
我们接着进行引用
在这里插入图片描述
在这里插入图片描述
引用完也会生成对应的客户端配置文件
在这里插入图片描述

然后编写客户端代码

namespace WCFClient
{
    class Program
    {
        static void Main(string[] args)
        {
            //添加完服务引用后,VS会为我们建立一个客户端代理类,名字以服务名+Client来命名
            ServiceReference1.HelloWorldServiceClient client = new ServiceReference1.HelloWorldServiceClient();

            string str = client.HelloWorld();

            Console.WriteLine(str);
            Console.ReadLine();
            client.Close();
        }
    }
}

在这里插入图片描述
然后运行客户端,就可以正常调用服务端的代码了
在这里插入图片描述

服务端使用app.config的写法

新建一个控制台文件,并打开app.config文件。如果没有app.config文件的话:右键点击项目->添加->新建项->应用程序配置文件
在这里插入图片描述
在这里插入图片描述
添加对应的配置信息,如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
    <system.serviceModel>
      <services>
        <!--
          WCFServiceConfig.HelloWorldService:命名空间.接口实现类
          behaviorConfiguration:用来引用config内的服务行为
        -->
        <service name ="WCFServiceConfig.HelloWorldService" behaviorConfiguration="behavior">
          <host>
            <baseAddresses>
              <!--定义的服务的网址-->
              <add baseAddress="http://localhost:8000/WCFService"/>           
            </baseAddresses>
          </host>
          <!--WCFServiceConfig.IHelloWorldService:命名空间.接口类-->
          <endpoint address="HelloWorldService" binding="wsHttpBinding" contract="WCFServiceConfig.IHelloWorldService" />
          <!--下面这个固定格式-->
          <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        </service>
      </services>
      <behaviors>
        <serviceBehaviors>
          <!--定义一个行为-->
          <behavior name="behavior">
            <!--true:客户端可用HTTP GET的方法从服务端下载元数据-->
            <serviceMetadata httpGetEnabled="true"/>
          </behavior>
        </serviceBehaviors>
      </behaviors>
    </system.serviceModel>
</configuration>

在这里插入图片描述
我们的代码处就可以简便很多,如下:

namespace WCFServiceConfig
{
    class Program
    {
        static void Main(string[] args)
        {
            ServiceHost host = new ServiceHost(typeof(HelloWorldService));

            host.Open();

            Console.WriteLine("HelloWorldService Configuration is Start");
            Console.ReadLine();

            host.Close();
        }
    }
            //标记为 [ServiceContract] 属性的接口都表示该接口是一个服务协定
            [ServiceContract]
            interface IHelloWorldService
            {
                //标记为 [OperationContract] 属性的方法都表示该方法是一个操作协定
                [OperationContract]
                string HelloWorld();
            }

            //创建了服务协定后,要写一个类去实现它,让这个服务有实体,这个实体是它逻辑真正存在的地方
            public class HelloWorldService : IHelloWorldService
            {
                public string HelloWorld()
                {
                    return "Hello World!";
                }
            }

}

在这里插入图片描述
运行一下程序,在浏览器打开对应的地址,正常显示的话就成功了:
在这里插入图片描述

通过IIS部署WCF

服务端

添加一个控制台应用,并添加这个引用
在这里插入图片描述

App_Code

IIS的代码文件应该存放在IIS应用程序目录的App_Code子目录下。
创建一个App_Code文件,并在其中创建我们对应的接口类
在这里插入图片描述
然后在Program.cs中编写代码:
在这里插入图片描述

	namespace WCFIIS
	{
	
	        //标记为 [ServiceContract] 属性的接口都表示该接口是一个服务协定
	        [ServiceContract]
	        interface IHelloWorldService
	        {
	            //标记为 [OperationContract] 属性的方法都表示该方法是一个操作协定
	            [OperationContract]
	            string HelloWorld();
	        }
	
	        //创建了服务协定后,要写一个类去实现它,让这个服务有实体,这个实体是它逻辑真正存在的地方
	        public class HelloWorldService : IHelloWorldService
	        {
	            public string HelloWorld()
	            {
	                return "Hello World!";
	            }
	        }
	}

Wcf.svc

然后在右键新建一个类,重命名为Wcf.svc
或者创建个Wcf.cs在改后缀名的也可以。
在这里插入图片描述
在Wcf.svc中就写入一行

<%@ServiceHost language = c# Debug="true" Service="WCFIIS.HelloWorldService"%>

<%%>:表示这个是一个服务器端包含;
@ServiceHost :表示这是个WCF的服务;
language=c# :表示我们用C#语言来写代码;
WCFIIS.HelloWorldService:我们的命名空间和接口实现类
.svc文件就相当于一个向导,帮我们在IIS宿主中找到服务的位置

Web.config

右键项目-add-New Item-;如下图创建一个Web.config的配置文件,名字只能叫Web.config
在这里插入图片描述

	<?xml version="1.0" encoding="utf-8" ?>
	<configuration>
	  <system.serviceModel>
	    <services>
	      <!--WCFIIS.HelloWorldService 命名空间和接口实现类-->
	      <!--behaviorConfiguration:服务行为-->
	      <service name="WCFIIS.HelloWorldService" behaviorConfiguration="metadataExchange">
	        <!--WCFIIS.IHelloWorldService 命名空间和接口类-->
	        <!--这边就没有host命名基地址了,因为部署在IIS,所以基地址由ISS定义了-->
	        <endpoint address="" binding="wsHttpBinding" contract="WCFIIS.IHelloWorldService"/>
	        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
	      </service>
	    </services>
	    <behaviors>
	      <serviceBehaviors>
	        <behavior name="metadataExchange">
	          <serviceMetadata httpGetEnabled="true"/>
	        </behavior>
	      </serviceBehaviors>
	    </behaviors>
	  </system.serviceModel>
	</configuration>

在这里插入图片描述

把WCF服务端部署到IIS

在这里插入图片描述
添加MIME类型
扩展名:svc
MIME类型:application/octet-stream

在这里插入图片描述
在这里插入图片描述
添加.svc管理处理程序:
请求路径: *.svc
类型: System.ServiceModel.Activation.HttpHandler
名称: svc-Integrated

在这里插入图片描述
在这里插入图片描述
然后在浏览器输入:http://192.168.30.128:8000/Wcf.svc
如下显示的话就成功了:
在这里插入图片描述

客户端

新建一个控制类的项目
在这里插入图片描述
添加服务引用
在这里插入图片描述
在1的位置输入:http://192.168.30.128:8000/Wcf.svc,然后直接点击Go就行
在这里插入图片描述
在这里插入图片描述
app.config会自动生成如下配置

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
    </startup>
    <system.serviceModel>
        <bindings>
            <wsHttpBinding>
                <binding name="WSHttpBinding_IHelloWorldService" />
            </wsHttpBinding>
        </bindings>
        <client>
          <!--address要对应IIS服务那边的网址和端口号号-->
            <endpoint address="http://192.168.30.128:8000/Wcf.svc" binding="wsHttpBinding"
                bindingConfiguration="WSHttpBinding_IHelloWorldService" contract="ServiceReference1.IHelloWorldService"
                name="WSHttpBinding_IHelloWorldService">
                <identity>
                    <servicePrincipalName value="host/DESKTOP-EP63VAJ" />
                </identity>
            </endpoint>
        </client>
    </system.serviceModel>
</configuration>

在这里插入图片描述
然后mian方法律编写代码如下:

namespace WCFIISClient
{
    class Program
    {
        static void Main(string[] args)
        {
            //添加完服务引用后,VS会为我们建立一个客户端代理类,名字以服务名+Client来命名
            ServiceReference1.HelloWorldServiceClient client = new ServiceReference1.HelloWorldServiceClient();

            string str = client.HelloWorld();

            Console.WriteLine(str);
            Console.ReadLine();

            client.Close();
        }
    }
}

然后执行,得到调用WCF服务端的接口实现类的方法返回
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值