我这里命名为Kinoo.WCF.Client,第一次尝试去坐轮船

作者: 编程  发布:2019-11-20

图片 1

 

首次技术性博文,欢迎大家指教,谢谢!

3、右键单击此项目选择【添加服务引用】,弹出下面窗体,直接点击【发现(Discovery)】:

 

2、为什么【添加服务引用】时,使用【发现】,而不是使用明确的地址,原因有几点:

那是正常现象,因为还有个操作木有完成嘞! 表着急,请听俺慢慢道来~ 哈哈哈!

图片 2

代码很简单

6、打开MainWindow的设计视图,拖拽几个控件上来:

 

如果你的宿主程序的代码(下一节开始我们自己写宿主程序代码),在初始化Host或客户端时,使用C#代码在指定存取协议,最好抓紧改掉,那代码80%的可能没法见人的。就像如今的ADO.NET的基础操作现在基本没人会写一样,那种代码最好不要写,也没必要记住。

 

<Window x:Class="Kinoo.WCF.Client.MainWindow" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
        <Button Name="btnInvokeRequest" Content="Invoke" HorizontalAlignment="Left" Margin="351,104,0,0" VerticalAlignment="Top" Width="75" Height="23" Click="btnInvokeRequest_Click"/> 
        <TextBox Name="txtRequest" HorizontalAlignment="Left" Height="23" Margin="67,104,0,0" TextWrapping="Wrap" Text="Please input a number" VerticalAlignment="Top" Width="265"/> 
        <TextBlock Name="txtResponse" HorizontalAlignment="Left" Margin="67,150,0,0" TextWrapping="Wrap" Text="Responses" VerticalAlignment="Top" Height="48" Width="359"/>

    </Grid> 
</Window> 

图片 3

<?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_IService1" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:8733/Design_Time_Addresses/Kinoo.WCF.ServiceLibrary/Service1/"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IService1"
                contract="ServiceReference1.IService1" name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>
string namespaceName = Assembly.GetExecutingAssembly().GetName().Name.ToString();   这段代码是获取前文档命名空间的名称的,也就是对应的“ThePlay”。

Assembly assembly = Assembly.GetExecutingAssembly();   获取包含当前执行的代码的程序集。

SoundPlayer sp = new SoundPlayer(assembly.GetManifestResourceStream(namespaceName + ".Resources" + ".STEAMBLO.WAV"));   
namespaceName 是上面获取的空间名称,Resource是音频文件夹的名称,STEAMBLO.WAV 是对应的音频文件! 区分大小写! 不然会导致获取为空! 遗憾的是,只支持.wav格式的音频文件!
using Kinoo.WCF.Client.ServiceReference1;

首先要先引用两个类库文件

都不是,看看服务器端或客户端的配置文件即可了,至于协议,也是虽然入门必知,但也是较深的内容,后面的章节再讲。因为:WCF接口在开发时可以不用管用什么协议存取,只要专注于接口开发即可。至于到底采用什么协议,可以由配置文件决定(当然也可以代码决定,但是写这种初级代码不是现代程序员的风格),甚至配置文件可以决定同时采用N种协议,一起支持!是不是很爽呢?

using System.Reflection;
using System.Media;

图片 4

最后,Ctrl+F5,大功告成!

图片 5

OK,第一步:找到你要引用的音频文件,右键单击,出现如下菜单,然后找到属性,左键单击;

8、右键单机项目【Kinoo.WCF.Client】,选择【调试】-【启动新实例】,然后WPF客户端启动了,但是也发现另一个问题,Host服务器端也自动启动了。先不管为什么自动启动,我们先输入个值试试火力!

假设个场景,你第一次见到轮船,第一次尝试去坐轮船!你会不会对盆友喊着说:“快看,轮船到了~!”

7、在按钮的Click事件里,添加如下代码:

“什么?不会,好吧,你淡定的有点儿不正常”

图片 6

“你在第一次坐轮船时,会不会很兴奋?”

继续上一节的内容。上一节的网址:

好吧,言归正传!

4、数据也获取了,程序也调通了,这个实例用的是什么数据存取协议呢??SOAP?Socket?Remoting?

 1 using System.Reflection;
 2 using System.Media;
 3 
 4 namespace ThePlay
 5 {
 6     class Program
 7     {
 8         static void Main(string[] args)
 9         {
10             string namespaceName = Assembly.GetExecutingAssembly().GetName().Name.ToString();  
11             Assembly assembly = Assembly.GetExecutingAssembly();
12             SoundPlayer sp = new SoundPlayer(assembly.GetManifestResourceStream(namespaceName + ".Resources" + ".STEAMBLO.WAV"));
13             Console.Write("快看,轮船到了~!");
14             sp.Play();
15             Console.ReadLine();
16         }
17     }
18 }

a、App.config中多了一段话,就是上一节的最后一个截图中那个配置文件的内容

 

1、为什么我调试Client的时候,服务器端会自动执行?

第二步:找到生成操作,把“内容”改成“嵌入的资源”。

b、解决方案多了一些内容:增加了一个Service Reference,增加了与其配套的命名空间,比如System.ServiceModel、System.Runtime.Serialization,如下图所示,其中这些命名空间看来是客户端必备了,具体左右以后章节再说,或者自己现在去Google。

更多精彩内容,请加群:225443677

那么问题来了:

是的,上面这段代码实现的就是这段场景,当你说过这句话后,轮船也相当应景,就来了几声汽笛声!

 

什么?还是播放不了?

c、服务端接口发生变化了,怎么办?右键单机服务引用,选择【更新服务引用】

OK,先看下代码:

   1:          private void btnInvokeRequest_Click(object sender, RoutedEventArgs e)

   2:          {

   3:              try

   4:              {

   5:                  Service1Client client = new Service1Client();

   6:                  txtResponse.Text = client.GetData(Int32.Parse(txtRequest.Text));

   7:              }

   8:              catch (Exception ex)

   9:              {

  10:                  txtResponse.Text = ex.Message;

  11:              }

  12:          }

7、OK,一个完整的客户端完成了,可以调用服务器端所有的开发接口(或者说服务契约ServiceContract)。

5、说起上面这个特性不得不提到WCF的另一种项目类型【WCF服务应用程序】,我们建立一个,会发现,里面也有个配置文件,不过这个文件是Web.Config,而不是App.Config,说明这种项目比较适合Web,同时,右键单击项目,点击【发布】,是以发布Web应用的形式来发布的。这种通用性不高,尤其是在大数据量传输的时候,WEB模式传数据速度、稳定性等没保证。至于再后面两种服务应用,暂时不做讨论,后面章节再说。

1、在解决方案中新增一个WPF Windows项目,或者根据你的能力建立其他可独立执行的项目Console或者WinForm都可以,我这里命名为Kinoo.WCF.Client

首先添加引用:

图片 7

a、如果你引用的是别的项目组、别的产品、甚至是别的公司的引用,输入明确的网址是当然的、必须的。如果你的项目组把WCF服务器端客户端是分开两个解决方案各自编译的,不得不各自调试,最好建议你的头儿整合到一起,这个是为了自己好,省的误导。

然后添加代码:

图片 8

 

5、我们双击ServiceReference1,可以打开对象浏览器,看到Service1Client,如下图所示,同时构造方法默认有多达5个重载,当然,我们的无脑开发,还是采用无参数的,后面的章节再讲其它构造方法。

4、直接点击【确定】,Visual Studio会自动启动那个服务端,获取服务器端的各种存取端口(或者说Contract),执行完成,发现几个变化

5、如果解决方案中,有N个子项目都要调用服务器,难道每个都要添加服务引用吗?

右键单击WCF服务库项目,选择【属性】,此项目比别的项目多一个标签:【WCF选项】,这里有个【在调试同一解决方案中的其他项目是启动WCF服务主机】,默认这个CheckBox是被Checked的,所以只要是解决方案中的其它项目调试,他都会自动启动。这个实在太方便了。因为我们的WCF服务将来可以发布成一个独立的Windows程序作为运行时主机,也可以发布成一个Console程序作为运行时主机,还可以发布成Windows服务作为运行时主机,但是这个都是发布以后的事情,调试阶段,有这个东西在,实在太爽了,用一段时间就会体会到了。

 

2、不做任何工作,直接打开项目的app.config,发现里面没WCF的东西,只有这点内容:

b、服务器端客户端在一个解决方案下不会产生任何影响、冲突。反倒调试的时候非常爽,你可以在服务端GetData上加个断点,一调试就知道了。

如果改了GUID还是不行,重建一个项目好了。

6、如果你【添加服务引用】时【发现】不了服务,可以到下面这个网址看看原因:

a、之所以能看到IService1接口,是因为添加服务引用;之所以能看到ServiceClient,是因为Visual Studio帮你封装了一个只要是写客户端的人都会封装的代码,之所以封装的这个Client里能看到GetData接口,是因为你服务器端的声明。

b、所谓的契约就是以前我们常说的接口,Service1是服务契约,GetData是操作契约。输入的参数、返回的值都是数据契约,Int、String这些基础数据类型可以理解为数据契约,你自己建立的类要想作为输入输出的参数之一,标记上DataContract即可,如下图所示。把各种文章说到的各种理论全忘记,记住刚才这句话以及下面这个图就足够了。以后的开发再慢慢深化即可。

图片 9

9、至此,完整的wCF客户端+半完整的WCF服务器端(为什么说服务器端半完整,可以去看上一节所说),已经OK了。

App.Config<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>

 

图片 10图片 11

3、现在可以问问为什么能看到IService1、还能看到ServiceClient、还能调用GetData接口?

神秘莫测的WCF入门至此完成,只写了两行代码,感觉如何呢?WCF简单吗?NO,看看那些长篇大论的WCF入门教程你就知道了。只不过Visual Studio讲这一切简化了。感谢微软!

 

图片 12

单建一个类库项目,添加服务引用,其他所有使用服务器端的子项目都引用这个类库即可了。

图片 13

本节代码下载地址:Kinoo.WCF-2.rar

本文由9159.com发布于编程,转载请注明出处:我这里命名为Kinoo.WCF.Client,第一次尝试去坐轮船

关键词: