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. React Native中树 TreeView 实现(2)

    接上文,剩下的展示工作是重中之重,首先确定节点的布局草稿——也就是如何render item: 在此之前还有一个重要的问题就是选择何种组件盛放展示子结点,一般有如下两种: 使用scrollview加载 ...

  2. JSoup 用法详解

    清单 1 // 直接从字符串中输入 HTML 文档 String html = "<html><head><title> 开源中国社区 </titl ...

  3. 让mbox支持up效果

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  4. 【jQuery】remove()和empty()的使用

    在项目需求中 ,会涉及,为select下拉框中重新填充或追加新的下拉项. 这样的话 之前的下拉项就需要清除掉. 有了这个需求,就需要我们注意到remove()和empty()的区别在哪里: empty ...

  5. memcache在大型网站的应用策略

    [部署策略] 基于memcached的 slab 和dump的内存管理方式,它产生的内存碎片比较少,不需要OS去做繁杂的内存回收,所以它对CPU的占用率那是相当的低.所以建议将它跟占用CPU较高 的W ...

  6. docker学习总结--安装、卸载

    参考:http://blog.csdn.net/u012562943/article/details/50463400 https://docs.docker.com/engine/getstarte ...

  7. 数学图形(2.15)Spherical sinusoid球面正弦曲线

    这个曲线与之前的数学图形(2.7)sphere sine wave很相似.而且个人觉得从其公式上看sphere sine wave更应该叫做球面正弦曲线.当然从渲染的曲线图上看,它是非常明显的贴在球上 ...

  8. Orchard运用 - 为评论启用Gravatar头像

    在前一篇随笔中我曾分享如何为Orchard特定主题添加独立代码文件, 今儿延续如何把对应代码应用到Views上. 对此我不妨把为评论启用Gravatar头像这一例子来实现.其实很简单, 思路大概就是创 ...

  9. TestNG测试带参构造函数的类

    今天被同事问到一个问题,问题描述如下: 一个测试类,只有一个带参构造函数.在带参构造函数上加@Test,同时加@Parameters注解从testng.xml中传递参数.为保证测试函数在带参构造函数之 ...

  10. iOS公布app到App Store教程

    要公布首先须要公布证书,其获取和安装的基本流程和真机调试证书一致,关于真机调试证书的获取和使用能够參考这篇文章.只是如今Xcode7不须要真机调试证书也可实现真机调试了.能够參考这篇文章. 要获取证书 ...