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服务端的接口实现类的方法返回