年前辞职-WCF入门学习(4)
前言
上一篇的学习中碰到一个问题,用地址http://localhost:8080/mex 访问元数据的时候一直提示400 bad request 错误,因为时间太晚了,查了好几遍代码,也没有发现问题。刚刚又试验了一下,解决方案分两步
①用管理员方式运行vs,
② 将
<serviceMetadata httpGetEnabled="true" />
改成
<serviceMetadata httpGetEnabled="true" httpGetUrl="mex"/>
也就是 我们给他指定一个httpGetUrl,至于为什么这么做,是参考的serviceMetadata。
最后,要说关于mex endpoint的作用,通俗的来讲就是只要客户端访问这个地址,他就可以知道关于这个WCF服务一些说明介绍。
第四集 WCF service implementing multiple service contracts
假设有这样的场景,有个公司需要通过http 给外网提供一个公共服务,同时又需要通过tcp协议给公司防火墙内的内容用户提供另一个服务,并且,还不想写多个WCF服务。
所以这一集主要两点,
- 在一个WCF服务中实现两个contract
- 通过endpoint配置对外界提供这两个服务 contract
关于如何搭建一个WCF服务,可以参考上一篇,这集只讲一些其他的重点。
首先是新建一个类库,然后添加一个WCF服务项,取名CompanyService。然后打开ICompanyService.cs,删除里面原先的ICompanyService接口,添加如下两个接口。
[ServiceContract]
public interface ICompanyPublicService
{
[OperationContract]
string GetPublicInformation();
} [ServiceContract]
public interface ICompanyConfidentialService
{
[OperationContract]
string GetConfidentialInformation();
}
解释一下,我们定义了两个合约,一个是公用PublicService ,一个是机密的ConfidentialService,里面分别有各自的GetInformation方法。
然后打开CompanyService.cs 文件,修改里面的CompanyService 类为如下内容:
public class CompanyService : ICompanyPublicService, ICompanyConfidentialService
{
public string GetConfidentialInformation()
{
return "这是机密内网的服务";
} public string GetPublicInformation()
{
return "这是外网的公共服务";
}
}
解释一下,我们的服务名称依旧没有改变,还是CompanyService,但是他实现了上面定义的两个有ServiceContract特性的契约接口。
类定义完毕,然后是配置文件部分。关于整体的配置文件,请看上一篇,下面是完整代码。
<system.serviceModel>
<services>
<service name="Part4.CompanyService" behaviorConfiguration="mexBehavior">
<endpoint address="CompanyService" binding="basicHttpBinding" contract="Part4.ICompanyPublicService"></endpoint>
<endpoint address="CompanyService" binding="netTcpBinding" contract="Part4.ICompanyConfidentialService"></endpoint>
<endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"></endpoint>
<host>
<baseAddresses>
<add baseAddress="http://localhost:8080/"/>
<add baseAddress="net.tcp://localhost:8090/"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors >
<behavior name="mexBehavior">
<serviceMetadata httpGetEnabled="true" httpGetUrl="mex"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
因为自己也是初学者,所以在手写的时候还是会碰到一些问题。比如 service节点 的name 属性,表示服务的名字,内容是实现接口的带命名空间的类名;而endpoint里面的contract的名字是定义的时候的带命名空间的接口名字。同时,为了让客户端可以通过添加服务引用的方式来调用,不要忘记了mex endpoint ,以及serviceMetadata元素。
然后新建一个控制台程序,用来托管这个服务。关于如何创建,依旧查看上一篇。启动服务。
完成之后编写客户端代码来调用。
我们新建一个Asp.net 的空网站,然后添加服务引用:
可以看到,CompanyService里面包含了两个服务。点击确定,查看一下网站的web.config 文件。
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_ICompanyPublicService" />
</basicHttpBinding>
<netTcpBinding>
<binding name="NetTcpBinding_ICompanyConfidentialService" />
</netTcpBinding>
</bindings>
<client>
<endpoint address="http://localhost:8080/CompanyService" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_ICompanyPublicService"
contract="CompanyService.ICompanyPublicService" name="BasicHttpBinding_ICompanyPublicService" />
<endpoint address="net.tcp://localhost:8090/CompanyService" binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_ICompanyConfidentialService"
contract="CompanyService.ICompanyConfidentialService" name="NetTcpBinding_ICompanyConfidentialService">
<identity>
<userPrincipalName value="LOUSAIBIAO\Sheldon" />
</identity>
</endpoint>
</client>
</system.serviceModel>
这些都是自动生成的代码,用来配合我们客户端的调用。
然后给网站添加一个新页面,拖两个button ,两个label (你们都懂得)大致就这个效果。
编写两个button的点击事件。
protected void Button1_Click(object sender, EventArgs e)
{
//因为有多个endpoint ,所以要指定名字
var client = new CompanyPublicServiceClient("BasicHttpBinding_ICompanyPublicService");
Label1.Text = client.GetPublicInformation();
}
protected void Button2_Click(object sender, EventArgs e)
{
var client = new CompanyConfidentialServiceClient("NetTcpBinding_ICompanyConfidentialService");
Label2.Text = client.GetConfidentialInformation();
}
调试运行该网站,并点击按钮,得到如下结果。
。
至此,实现方面的介绍完毕,有一点要说明的,因为我们是在vs上本机调试,说以,两个button都能获取的数据,但如果是过防火墙的外网来访问,在没有给控制面板中的防火墙添加额外的入站出站规则的时候,GetConfidential 方法是无效的。
介绍完毕,Thank you。
年前辞职-WCF入门学习(4)的更多相关文章
- 年前辞职-WCF入门学习(1,2)
前言 周一的时候辞职了,离开了从12年毕业后8月份开始一直到现在的公司. 辞职之后当然是玩.玩了若干天的游戏,真的是没日没夜啊,但是玩的太坑,怒删游戏.话说上次玩还是在14年7月份.下次还是过年回家再 ...
- 年前辞职-WCF入门学习(5)
前言 第五集比较简单,视频也只有7分多钟,但是用处还是挺大的.下面我会介绍. 本来想第六集一起介绍的,后来发现第六集内容比较多,有半个多小时,就不一起了.网站规定6小时内只能发布一篇文章到首页,,那我 ...
- 年前辞职-WCF入门学习(3)
前言 [2了,刚写好的,手贱,点了删除,还真TMD的删除了,只好重写] 今天周六,去同事家聚了一个餐,感觉各种豪华. 废话不多说,前两集大致介绍了一下什么是WCF以及和WCF相关的WebService ...
- 年前辞职-WCF入门(6)
前言 昨天早上去医院做入职体检,被告知要预约,本以为是要排队,我连视频都准备好了...结果就回来了.下午去了新公司那边找房子,2了,因为公司提供了班车列表,我既然就只在班车所经过的几个地方找,却遗漏了 ...
- WCF入门学习2-控制台做为宿主
Step1.创建一个WCF类库和一个控制台程序. Step2.引用WCF项目. Step3.添加这两个引用. //本段代码出处 无废话WCF入门教程系列 Uri baseAddress = new U ...
- 菜鸟级别的WCF入门学习
这两天学习WCF,看了MSDN上的入门教程,和查找了一些网上给的例子,简单的实现了一下,感觉应该很适合我这种菜鸟级的选手看了. 1.新建一个项目--WCF--WCF服务应用程序 用的是MSDN上的加减 ...
- WCF入门学习3-配置文件与部署iis
配置文件设置 --------------------------------------------------- 创建的时候都会有个配置文件,其实有一个WCF配置编辑器,右键就可以点出来设置. 需 ...
- WCF入门学习1-最简单的一次通信
跟着msdn的教程试了一下wcf,真心好用 1.先创建一个wcf服务库,是服务类库,远程的lib 2.全部按照默认设置,不修改.然后点发布,会出现一个wcf测试客户端,可以看有没有发布成功. 3.ms ...
- WCF入门教程(四)通过Host代码方式来承载服务 一个WCF使用TCP协议进行通协的例子 jquery ajax调用WCF,采用System.ServiceModel.WebHttpBinding System.ServiceModel.WSHttpBinding协议 学习WCF笔记之二 无废话WCF入门教程一[什么是WCF]
WCF入门教程(四)通过Host代码方式来承载服务 Posted on 2014-05-15 13:03 停留的风 阅读(7681) 评论(0) 编辑 收藏 WCF入门教程(四)通过Host代码方式来 ...
随机推荐
- 修改镜像文件EI.CFG
一.EI.cfg说明 Windows 7 安装光盘中存在着 SOURCES\EI.CFG 这样一个配置文件.EI.cfg 是特定于 Windows 安装程序的配置文件,用于确定在安装过程中应该使用哪种 ...
- LAMP编译参数查看
Linux下查看Nginx.Napache.MySQL.PHP的编译参数的命令如下: 1.nginx编译参数:#/usr/local/nginx/sbin/nginx -V2.apache编译参数:# ...
- 我的NopCommerce之旅(6): 应用启动
一.基础介绍 Global.asax 文件(也称为 ASP.NET 应用程序文件)是一个可选文件,该文件包含响应 ASP.NET 或 HTTP 模块所引发的应用程序级别和会话级别事件的代码. Appl ...
- 怎样用ZBrush快速雕刻皮肤纹理
今天的ZBrush教程我们将对利用基础笔刷制作出的“亡灵僵尸”头部模型进行皮肤纹理的处理,主要用到了Layers 3D图层和Alpha笔触类型添加皮肤纹理. 详细的视频教程地址可前往:http://w ...
- 边工作边刷题:70天一遍leetcode: day 70
Design Phone Directory 要点:坑爹的一题,扩展的话类似LRU,但是本题的accept解直接一个set搞定 https://repl.it/Cu0j # Design a Phon ...
- 如何显示隐藏的Administrator账户
在Windows XP中,Administrator帐户是终极管理员,如果你创建了其他管理员帐户,那么该帐户就会从欢迎屏幕上被隐藏.这里需要注意的是,仅仅是从欢迎屏幕上被隐藏,该帐户仍然存在. 如 ...
- HDU 3400 Line belt【三分套三分】
从A出发到D,必定有从AB某个点E出发,从某个点F进入CD 故有E,F两个不确定的值. 在AB上行走的时间 f = AE / p 在其他区域行走的时间 g = EF / r 在CD上行走的时间 ...
- Android代码优化----Application节点的模板写法及UI工具类
一. MyApplication类的编写: 新建一个类MyApplication,继承自Application.代码如下: MyApplication.java: package com.smyhva ...
- SqlMapConfig.xml中的setting属性设置
<settings cacheModelsEnabled="true" lazyLoadingEnabled="false" en ...
- Android Handler处理机制 ( 二 ) ——Handler,Message,Looper,MessageQueue
Android是消息驱动的,实现消息驱动有几个要素: 消息的表示:Message 消息队列:MessageQueue 消息循环,用于循环取出消息进行处理:Looper 消息处理,消息循环从消息队列中取 ...