wcf: 分为服务器端和客户端两部分 ,这两部分工作流程如下:
1 服务器端创建wcf服务器
2 将服务端通过 EndPoint端点 与客户端通信
3 在使用客户端时,创建一个代理服务,然后再客户端使用这个代理服务
EndPoint 端点 也成为服务的ABC
A: address :代表服务地址 , a的作用是让客户端知道从哪调wcf服务
B :binding : 代表数据的绑定类型,不同的绑定类型对应不同的服务调用方式 b的用是让客户端知道如何调用wcf服务
C:contract :代表服务契约, 契约是调用服务是必须遵守的规格。契约的作用是让客户端知道 服务器端提供什么服务。
wcf 定义4种类型的契约
service constract
data constract
message constract
fault contract
wcf 数据的绑定类型
Peer network binding:使用p2p网络进行通信,这种绑定的类型使用率较高
tcp binding : 使用tcp在互联网进行跨机器通信
basic binding:用来对以前 asmx web service 提供支持 这样是既有的客户端程序可以连接到wcf服务,wcf客户端也可以使用web service 服务
ipc binding: 在同一主机上使用命名通道进行通信,拥有极高的安全保护能力,不接受任何本机以调用
web service binding: 使用http,https 在互联网上进行通信,这种绑定类型支持 可靠行 事务性 安全性等功能。
federated ws binding:专用的ws-federated 绑定协议
duplex ws binding :支持服务端客户端之间的双向通信
msmq binding:支持离线消息队列的调用
msmq integration binding:在wcf消息和msmq 消息直接转换。
开始发布用的默认 配置如下,项目运行是成功
1
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
2:
<system.serviceModel>
<services>
<service behaviorConfiguration="" name="d">
<endpoint address="localhost" binding="wsHttpBinding" bindingConfiguration="TransportSecurity" contract="">
</endpoint>
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="TransportSecurity">
<security mode="Transport">
<transport clientCredentialType="None" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
关键是加粗的两行。
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name="BOAutoApprovalWCFBehavior"> //---name=服务的名称 默认为空 自动获取
<serviceMetadata httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="BOAutoApprovalWCFBehavior" name="BOAutoApprovalWCF">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="TransportSecurity"
contract="IBOAutoApprovalWCF">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
</service>
</services>
<bindings>
<wsHttpBinding>
<binding name="TransportSecurity">
<security mode="Transport">
<transport clientCredentialType="None" />
</security>
</binding>
</wsHttpBinding>
</bindings>
</system.serviceModel>
不明白service 配置:
<service behaviorConfiguration="BOAutoApprovalWCFBehavior" name="BOAutoApprovalWCF">
<endpoint address="" binding="wsHttpBinding" bindingConfiguration="TransportSecurity"
contract="IBOAutoApprovalWCF">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
</service>
</services>
当配置出错时:
<service behaviorConfiguration="" name="d">
解析:
behaviorConfiguration: 服务行为 可以为空
name : 必须有值
contract:可以为空
<endpoint address="localhost" binding="wsHttpBinding" bindingConfiguration="TransportSecurity" contract="">
bindingConfiguration: 对应 :<binding name="TransportSecurity">
address:服务地址, 默认为kong,可以是: localhost
binding:数据的绑定类型
contract :代表服务契约,可以为kong .
<serviceMetadata httpGetEnabled="true" />就表示,服务里要提供基于http协议的元数据交换功能
WCF中容易出现的错误:在服务“Service1”实现的协定列表中找不到协定名称
出错的原因有两个:
1. 看契约是否写对, 这个一般不会写错
2.看配置文件:service name="空间名+服务名称" endpoint contract="空间名+契约名称"
(这里有个小细节要注意, ""中不能出现空格,否则依然报错)
服务名称: 对应 <behavior name="Service1">
name属性的值可以随意赋值
<behaviors>
<serviceBehaviors>
<behavior name="Service1">
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceBehaviors>
<behavior name="d">
<serviceMetadata httpGetEnabled="true" />
</behavior>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
契约名称:对应接口契约名称: [ServiceContract(Name ="IService1")]
[ServiceContract(Name ="IService1")]
public interface IService1
{
[OperationContract(Name="doWork")]
string DoWork(string name);
}