WCF服务使用(IIS+Http)和(Winform宿主+Tcp)两种方式进行发布
[ServiceContract]
public interface IPeopleInfo
{
[OperationContract]
int GetAge(string name);
}
数据契约:
[DataContract]
public class People
{
public string Name;
public int Age;
}
服务实现:
public class PeopleInfo : IPeopleInfo
{ public int GetAge(string name)
{
List<People> peopleList = DataFactory.GetPeopleList();
return peopleList.Find(t =>t.Name==name).Age ;
}
}
辅助类:
public class DataFactory
{
public static List<People> GetPeopleList()
{
List<People> peopleList = new List<People>();
peopleList.AddRange(new People[] {
new People{Name="tjm",Age=},
new People{Name="lw",Age=},
new People{Name="tj",Age=},
});
return peopleList;
}
}
WCF部署IIS出现“由于扩展配置问题而无法提供您请求的页面。如果该页面是脚本,请添加处理程序。如果应下载文件,请添加 MIME 映射”的解决办法
管理员身份运行C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\ServiceModelReg.exe -i
HTTP 错误 404.3 - Not Found,
使用管理员注册:C:\Windows\system32>"C:\Windows\Microsoft.NET\Framework\v4.0.30319\ServiceModelReg.exe" -r
Microsoft(R) WCF/WF 注册工具版本 4.5.0.0
版权所有(C) Microsoft Corporation。保留所有权利。
用于管理一台计算机上 WCF 和 WF 组件的安装和卸载的管理实用工具。
[错误]此 Windows 版本不支持此工具。管理员应改为使用“打开或关闭 Windows 功能”对话框或 dism 命令行工具来安装/卸载 Windows Communication Foundation 功能。
根据错误的提示,去控制面板->程序->启用或关闭Windows功能,如下图

把我画红线的框内的复选框全部勾选,点击确定,然后再在iis中再进行浏览就能够找到发布后的WCF服务了,原因应该是我没有安装WCF服务的组件而导致的吧。在浏览器中浏览服务如下。

在window功能中卸载iis和WCF服务,然后再重新安装配置。
首先建立一个Winform项目,界面如下。

注意:在部署之前需要把第一步中编写服务的dll引用进来。
ServiceHost host;
private void btnStart_Click(object sender, EventArgs e)
{
//使用代码绑定
Uri tcpa = new Uri("net.tcp://172.21.212.54:8090/peopleinfo");
host = new ServiceHost(typeof(FirstWCFService.PeopleInfo), tcpa);
ServiceMetadataBehavior mBehave = new ServiceMetadataBehavior();
NetTcpBinding tcpb = new NetTcpBinding();
host.Description.Behaviors.Add(mBehave);
host.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexTcpBinding(), "mex");
host.AddServiceEndpoint(typeof(FirstWCFService.IPeopleInfo), tcpb, tcpa); host.Open();
this.btnStart.Enabled = false;
this.label1.Text = "Service Running";
} private void btnStop_Click(object sender, EventArgs e)
{
if (host != null)
{
host.Close();
this.label1.Text = "Service Closed";
this.btnStart.Enabled = true;
}
}
2)使用配置文件
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="FirstWCFService.PeopleInfo">
<!--客户端用来解释服务,这个端点如果缺少服务会发布失败-->
<endpoint contract="IMetadataExchange"
binding="mexTcpBinding" address ="net.tcp://172.21.212.54:8090/peoleinfo/mex"></endpoint>
<!--提供服务的端点-->
<endpoint address="net.tcp://172.21.212.54:8090/peoleinfo" binding="netTcpBinding"
contract="FirstWCFService.IPeopleInfo"> </endpoint>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
虽然是用来配置文件,但是开启服务的代码还是需要写的。代码如下。
ServiceHost host;
private void btnStart_Click(object sender, EventArgs e)
{
host = new ServiceHost(typeof(FirstWCFService.PeopleInfo));
host.Open();
this.btnStart.Enabled = false;
this.label1.Text = "Service Running";
} private void btnStop_Click(object sender, EventArgs e)
{
if (host != null)
{
host.Close();
this.label1.Text = "Service Closed";
this.btnStart.Enabled = true;
}
}
运行程序,点击Start按钮,到此使用Winform作为宿主来发布WCF服务已经成功了。



<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IPeopleInfo" />
</basicHttpBinding>
<netTcpBinding>
<binding name="NetTcpBinding_IPeopleInfo">
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="http://172.21.212.54/PeopleInfo.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IPeopleInfo" contract="HttpService.IPeopleInfo"
name="BasicHttpBinding_IPeopleInfo" />
<endpoint address="net.tcp://172.21.212.54:8090/peoleinfo" binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IPeopleInfo" contract="TcpService.IPeopleInfo"
name="NetTcpBinding_IPeopleInfo" />
</client>
</system.serviceModel>
</configuration>
调用服务操作的代码非常简单,就类似于操作本地的类一样,代码如下:
private void bntGet_Click(object sender, EventArgs e)
{
string name = this.txtName.Text;
int age;
if (rdbHttp.Checked)
{
HttpService.PeopleInfoClient httpClient = new HttpService.PeopleInfoClient();
age = httpClient.GetAge(name);
}
else
{
TcpService.PeopleInfoClient tcpClient = new TcpService.PeopleInfoClient();
age = tcpClient.GetAge(name);
}
this.txtAge.Text = age.ToString();
}
到此,wcf的客户端编写完成,结果如下。


System.ServiceModel.Security.SecurityNegotiationException: 服务器已拒绝客户端凭据。 --->
System.Security.Authentication.InvalidCredentialException: 服务器已拒绝客户端凭据。 --->
System.ComponentModel.Win32Exception: 登录没有成功
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<services>
<service name="FirstWCFService.PeopleInfo">
<!--客户端用来解释服务,这个端点如果缺少服务会发布失败-->
<endpoint contract="IMetadataExchange"
binding="mexTcpBinding" address ="net.tcp://172.21.212.54:8090/peoleinfo/mex"></endpoint>
<!--提供服务的端点-->
<endpoint address="net.tcp://172.21.212.54:8090/peoleinfo" binding="netTcpBinding"
contract="FirstWCFService.IPeopleInfo" bindingConfiguration="NoSecurity">
</endpoint>
</service>
</services>
<bindings>
<netTcpBinding>
<binding name="NoSecurity">
<security mode="None"/>
</binding>
</netTcpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
设置完成之后,重新开启服务。然后在客户端删除winform宿主发布的服务,并且再重新添加,以便在配置文件中重新生成访问tcp方式的服务端点的配置。更新后的配置文件如下,红色加粗部分为更新的。
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_IPeopleInfo" />
</basicHttpBinding>
<netTcpBinding>
<binding name="NetTcpBinding_IPeopleInfo">
<security mode="None" />
</binding>
</netTcpBinding>
</bindings>
<client>
<endpoint address="http://172.21.212.54/PeopleInfo.svc" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_IPeopleInfo" contract="HttpService.IPeopleInfo"
name="BasicHttpBinding_IPeopleInfo" />
<endpoint address="net.tcp://172.21.212.54:8090/peoleinfo" binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_IPeopleInfo" contract="TcpService.IPeopleInfo"
name="NetTcpBinding_IPeopleInfo" />
</client>
</system.serviceModel>
</configuration>
WCF服务使用(IIS+Http)和(Winform宿主+Tcp)两种方式进行发布的更多相关文章
- c# winform播放声音的两种方式
axWindowsMediaPlayer1.settings.setMode("", true); axWindowsMediaPlayer1.URL = "skcg.m ...
- WCF 一步一步 发布 WCF服务 到 IIS (图)
WCF 一步一步 发布 WCF服务 到 IIS (图) 使用VS自带的WCFSVCHost(WCF服务主机)发布WCF服务,时刻开发人员测试使用. 下面我们来看一下如何在IIS中部发布一个WCF服务. ...
- .Net WCF服务部署IIS详细解析
官方解析:Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台.整合了原有的windows通 ...
- C#动态调用WCF接口,两种方式任你选。
写在前面 接触WCF还是它在最初诞生之处,一个分布式应用的巨作. 从开始接触到现在断断续续,真正使用的项目少之又少,更谈不上深入WCF内部实现机制和原理去研究,最近自己做一个项目时用到了WCF. 从这 ...
- 第二节:SSL证书的申请、配置(IIS通用)及跳转Https请求的两种方式
一. 相关概念介绍 1. SSL证书服务 SSL证书服务由"服务商"联合多家国内外数字证书管理和颁发的权威机构.在xx云平台上直接提供的服务器数字证书.您可以在阿里云.腾讯云等平台 ...
- 不停止MySQL服务增加从库的两种方式
不停止MySQL服务增加从库的两种方式 转载自:http://lizhenliang.blog.51cto.com/7876557/1669829 现在生产环境MySQL数据库是一主一从,由于业务量访 ...
- XFire构建服务端Service的两种方式(转)
XFire构建服务端service的两种方式,一是用xfire构建,二是和spring集成构建. 一,xifre构建,确保把xfire的jar包导入到工程中或classpath. 1,service的 ...
- XFire构建服务端Service的两种方式
1.原声构建: 2.集成spring构建 http://blog.csdn.net/carefree31441/article/details/4000436XFire构建服务端Service的两种方 ...
- 不停止MySQL服务增加从库的两种方式【转载】
现在生产环境MySQL数据库是一主一从,由于业务量访问不断增大,故再增加一台从库.前提是不能影响线上业务使用,也就是说不能重启MySQL服务,为了避免出现其他情况,选择在网站访问量低峰期时间段操作. ...
随机推荐
- js闭包之我见
很久前的一个问题终于得以解决,内心是无比喜悦的,不多说,先上代码: function test(){ for(var i=0;i<5;i++){ window.onclick=function( ...
- 部署虚拟环境安装Linux系统
目录 准备工作 安装linux系统 重置root管理员密码 源代码编译 R ...
- 【learning】 单调队列与单调栈用法详解
1.单调栈 单调栈是指一个栈内部的元素具有严格单调性的一种数据结构,分为单调递增栈和单调递减栈. 其具有以下两个性质: 1,满足栈底到栈顶的元素具有严格单调性. 2,满足栈的先进后出特性,越靠近栈顶的 ...
- MySQL权限管理(五)
一.什么是MySQL权限 各大帖子及文章都会讲到数据库的权限按最小权限为原则,这句话本身没有错,但是却是一句空话.因为最小权限,这个东西太抽象,很多时候你并弄不清楚具体他需要哪些权限. 现在很多mys ...
- Scala 中的foreach和map方法比较
Scala中的集合对象都有foreach和map两个方法.两个方法的共同点在于:都是用于遍历集合对象,并对每一项执行指定的方法.而两者的差异在于:foreach无返回值(准确说返回void),map返 ...
- sql_auoload_regiester() 解释(转载)
在了解这个函数之前先来看另一个函数:__autoload. 一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: 运行index.P ...
- 【数组】Search a 2D Matrix
题目: Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the f ...
- Android 开发工具类 09_SPUtils
SharedPreferences 辅助类: 1.保存在手机里面的文件名: 2.保存数据的方法,我们需要拿到保存数据的具体类型,然后根据类型调用不同的保存方法: 3.得到保存数据的方法,我们根据默认值 ...
- Disconf 学习系列之Disconf是什么?
不多说,直接上干货! Disconf是什么 Distributed Configuration Management Platform(分布式配置管理平台) ,它是专注于各种分布式系统配置管理 的通用 ...
- Root-NFS: Unable to get mountd port number from server, using default
问题描述: 以前下载到开发板linux内核启动好好地,今天突然启动不了了,到达Root-NFS: Unable to get mountd port number from server, using ...