1、本文主要对WCF的基本使用做简单化介绍,对于初学WCF的来说,初期对于配置文件的理解,比较烦躁吧,相信你看完了该文,能够达到深入浅出的感觉。

关于WCF的概念 和 应用场景,在此处不做详细介绍,可用参考如下博主的首页:

http://www.cnblogs.com/artech/archive/2007/02/26/656901.html

2、好了,开始创建我们的WCF类库、宿主、和测试项目吧。

首先,先看一下我的解决方案:

(1)、先创建一个WCF服务库

(2)添加新项,FirstService,这个是我自己新建的。

(3)系统会自动给我们创建了上面两个类,一个接口,一个实现:

对接口定义操作方法(这里的申明都不需要public等限定符):

    public interface IFirstService
{
[OperationContract]
void DoWork(); [OperationContract]
string HelloWorld(string name);
}

(4)、实现部分

    public class FirstService : IFirstService
{
public void DoWork()
{
Console.WriteLine("This is the method DoWork.");
} public string HelloWorld(string name)
{
return "Hello" + name;
} }

(5)由于我们创建了两个服务,所以系统会给我们自动生产他们的配置文件,在这里(我们对其只需了解,因为我们并没有使用它,

因为我们是将WCF类库寄宿于Console应用上,我们的配置文件并不是这个,但和这个很多是相同的)

上图,对我们的两个服务进行了ABC的配置。我们可用将该类库设置为启动项直接运行,如下图,那么他就读取了该配置文件了。

请记住这个地址,会和我寄宿的地址不同。上面的也可以在VS提供的界面进行测试WCF服务。


接下来,我们将上面的库寄宿到控制台应用上。

创建控制台应用程序WCF1HOST,添加对 System.ServiceModel 和 上面 类库dll的引用;

代码如下:

class Program    {
static void Main(string[] args)
{
try
{
ServiceHost host1 = new ServiceHost(typeof(WCF1.Service1));
host1.Open();
Console.WriteLine("Service1 服务已经开启。"); ServiceHost host2 = new ServiceHost(typeof(WCF1.FirstService));
host2.Open();
Console.WriteLine("FirstService 服务已经开启。"); Console.WriteLine("输入exit可关闭服务并退出");
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
while (true)
{
string input = Console.ReadLine();
if (input.Equals("exit"))
{
break;
}
Console.WriteLine("服务继续...");
} //单个服务
//using (ServiceHost host = new ServiceHost(typeof(WCF1.FirstService)))
//{
// try
// {
// host.Open();
// Console.WriteLine("FirstService 服务已经开启。");
// Console.ReadLine();
// }
// catch (Exception ex)
// {
// Console.WriteLine(ex.Message);
// } //} ////创建宿主的基地址,假如我们没有配置 App.config 那么我们就需要指定了。
//Uri baseAddress = new Uri("http://localhost:8080/FirstService");
////创建宿主
//using (ServiceHost host = new ServiceHost(typeof(WCF1.FirstService), baseAddress))
//{
// //向宿主中添加终结点
// host.AddServiceEndpoint(typeof(WCF1.FirstService), new WSHttpBinding(), "");
// //将HttpGetEnabled属性设置为true
// ServiceMetadataBehavior smb = new ServiceMetadataBehavior();
// smb.HttpGetEnabled = true;
// //将行为添加到Behaviors中
// host.Description.Behaviors.Add(smb);
// //打开宿主
// host.Open();
// Console.WriteLine("WCF中的HTTP监听已启动....");
// Console.ReadLine();
// host.Close();
//}
}
}

对于上面的注视部分,相信大家也很容易理解,这里给出了两种(一种读取配置文件、一种手动配置URI,我们建议配置URI)

我们查看App.config文件(如果没有就创建)

<?xml version="1.0" encoding="utf-8" ?>
<configuration> <system.serviceModel> <!--Bindings-->
<bindings>
<netHttpBinding>
<binding name="IFirstServiceBinding"/>
</netHttpBinding>
</bindings> <!--Behavior-->
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors> <!--Services-->
<services>
<service name="WCF1.Service1">
<endpoint address="http://localhost:8888/Service1" binding="basicHttpBinding" contract="WCF1.IService1">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8888/Service1" />
</baseAddresses>
</host>
</service> <!--第二个Service-->
<service name="WCF1.FirstService">
<endpoint address="http://localhost:8888/FirstService" binding="basicHttpBinding" contract="WCF1.IFirstService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8888/FirstService" />
</baseAddresses>
</host>
</service> </services>
<!--结束多个Service--> </system.serviceModel> </configuration>

可用看到:<services> 就是我们的服务,我们这里提供了两个服务,此处

baseAddress="http://localhost:8888/Service1 和我们的类库中的地址已经不同了。 
但是配置确是相同的,都是配置ABC,这里的配置也是基本的标准配置。开启我们的寄宿程序如下:



最后,我们在客户端程序上测试,添加对两个服务的引用,如下

客户端调用服务引用,和调用类是一样的原理
class Program
{
static void Main(string[] args)
{
       //创建服务类
WCFTest1.MyService1.Service1Client sev1 = new MyService1.Service1Client();
Console.WriteLine("调用:Service1.GetData Method: " + sev1.GetData()); WCFTest1.MyFirstService.FirstServiceClient firstSev = new MyFirstService.FirstServiceClient();
Console.WriteLine("调用:Service1.MyFirstService Method: " + firstSev.HelloWorld("weiyaowen"));
Console.WriteLine("调用:Service1.HelloWorldAsync Method: " + firstSev.HelloWorldAsync("weiyaowen").Result); //获取异步调用WCF的 Result Console.ReadLine();
}
}
查看客户端下的配置文件App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
</startup>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IFirstService" />
<binding name="BasicHttpBinding_IService1" />
</basicHttpBinding>
</bindings>
<client>
<!--以下是配置两个服务的地址,在我们添加了服务引用之后会自动添加-->
<endpoint address="http://localhost:8888/FirstService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IFirstService" contract="MyFirstService.IFirstService"
name="BasicHttpBinding_IFirstService" />
<!--IService1-->
<endpoint address="http://localhost:8888/Service1" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IService1" contract="MyService1.IService1"
name="BasicHttpBinding_IService1" />
</client>
</system.serviceModel>
</configuration>

上面的文件在添加了服务引用之后会自动生成,可用看到,和我们寄宿服务的地址一模一样的,这样我们的客户端就能够顺利的找到WCF服务的地址了。

查看结果:



另外:在看看创建类库自动生产的配置,下面飘红的字体很明确的说了:主机的需要另外配置,那么我们可用选择拷贝过去咯,改下地址就OK了:
<?xml version="1.0" encoding="utf-8" ?>
<configuration> <appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" />
</system.web>
<!-- 部署服务库项目时,必须将配置文件的内容添加到
主机的 app.config 文件中。System.Configuration 不支持库的配置文件。-->
<system.serviceModel>
<services>
<service name="WCF1.Service1">
<endpoint address="" binding="basicHttpBinding" contract="WCF1.IService1">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8733//WCF1/Service1/" />
</baseAddresses>
</host>
</service>
<service name="WCF1.FirstService">
<endpoint address="" binding="basicHttpBinding" contract="WCF1.IFirstService">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
<host>
<baseAddresses>
<add baseAddress="http://localhost:8733//WCF1/FirstService/" />
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<!-- 为避免泄漏元数据信息,
请在部署前将以下值设置为 false -->
<serviceMetadata httpGetEnabled="True" httpsGetEnabled="True"/>
<!-- 要接收故障异常详细信息以进行调试,
请将以下值设置为 true。在部署前设置为 false
以避免泄漏异常信息-->
<serviceDebug includeExceptionDetailInFaults="False" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel> </configuration>

我们完全可用在创建寄宿应用程序时,将该文件,只修改一下BaseAddress 就能够部署:如下测试。

分享共进步!

WCF深入浅出学习1的更多相关文章

  1. 深入浅出学习Spring框架(四):IoC和AOP的应用——事务配置

    在前文 深入浅出学习Spring框架(一):通过Demo阐述IoC和DI的优势所在. 深入浅出学习Spring框架(三):AOP 详解 分别介绍了Spring的核心功能——IoC和AOP,光讲知识远远 ...

  2. 深入浅出学习Hibernate框架(二):JDBC基础操作

    上篇博客<深入浅出学习Hibernate框架(一):从实例入手初识Hibernate框架>简单介绍了一下Hibernate框架,并且举了一个实例来了解Hibernate.这篇博客将介绍JD ...

  3. 菜鸟级别的WCF入门学习

    这两天学习WCF,看了MSDN上的入门教程,和查找了一些网上给的例子,简单的实现了一下,感觉应该很适合我这种菜鸟级的选手看了. 1.新建一个项目--WCF--WCF服务应用程序 用的是MSDN上的加减 ...

  4. 年前辞职-WCF入门学习(4)

    前言 上一篇的学习中碰到一个问题,用地址http://localhost:8080/mex 访问元数据的时候一直提示400 bad request 错误,因为时间太晚了,查了好几遍代码,也没有发现问题 ...

  5. [转]学习 WCF (6)--学习调用WCF服务的各种方法

    转自:http://www.cnblogs.com/gaoweipeng/archive/2009/07/26/1528263.html 作者这篇博文写得很全面. 根据不同的情况,我们可以用不同的方法 ...

  6. WCF再学习小结

    http://www.cnblogs.com/jillzhang/archive/2010/04/04/1704388.html http://leelei.blog.51cto.com/856755 ...

  7. WCF初步学习

    一.理解面向服务(Service-Oriented-Architecture)    是指为了解决在Internet环境下业务集成的需要,通过连接能完成特定任务的独立功能实体实现的一种软件系统架构.S ...

  8. WCF双工学习笔记

    WCF双工的作用在于服务端执行某个方法的时候调用客户端的方法,有点类似委托的感觉,实际项目中在什么情况下使用还没想到. WCF双工支持两种bind,一是nettcp.另一个是wsDualHttp,这里 ...

  9. javascript深入浅出——学习笔记(六种数据类型和隐式转换)

    在慕课之前学过JS深入浅出,最近发现很多东西都记不太清楚了,再复习一遍好了,感觉这个课程真的超级棒的,做做笔记,再添加一些学习内容

随机推荐

  1. bzoj 4001 [TJOI2015]概率论 数学

    4010: [HNOI2015]菜肴制作 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/ ...

  2. kali下更新软件时,总是报错,说下列签名无效 解决办法

    解决办法就是重新获取下签名key wget -q -O - https://archive.kali.org/archive-key.asc | apt-key add

  3. ROS知识(5)----消息与服务的示例

    ROS中已经定义了较多的标准类型的消息,你可以用在这些标准类型的消息上再自定义自己的消息类型.这个在复杂数据传输很有用,例如节点和服务器进行交互时,就可能用到传输多个参数到服务器,并返回相应的结果.为 ...

  4. MYSQL学习笔记 (六)explain分析查询

    使用EXPLAIN可以模拟优化器执行SQL语句,从而知道MYSQL是如何处理你的SQL,从而分析查询语句或者表结构的瓶颈.

  5. MSChart使用小结

        在用到图表展示某项.多项信息的统计情况,很正常联想到MSChart控件.        以VS2008开发为例,在工具箱也中右击,选择”choose items“,打开对话框,选择COM组件T ...

  6. SMT Surface Mount Technology footprint references

    http://en.wikipedia.org/wiki/Surface-mount_technology Surface-mount technology (SMT) is a method for ...

  7. Eclipse启动项目时,删除workspaces无用的工作区间

    选择菜单栏的window-->Preferences-->General-->Startup and Shutdown-->workspaces, Recent workspa ...

  8. Andorid之Annotation框架初使用(二)

    Fragment: @EActivity(R.layout.fragments) public class MyFragmentActivity extends FragmentActivity { ...

  9. nose的测试报告

    有时候我们要让报告整洁美观点,以html展示测试结果,我们可以借助pip install nosehtmloutput插件输出html格式报告 from nose.plugins.plugintest ...

  10. RTF文件合并 备忘

    多个独立的rtf文件合并时,如果文件纸张方向存在横向 纵向不一致时,文件之间需要插入分节符 \pard \ltrpar\qj \li0\ri0\nowidctlpar\wrapdefault\aspa ...