1.定义契约
//Name参数表示:此服务在客户端的名字
//Namespace:表示这个服务所在的地址,此处可以写也可不写,这个地址可以在配置文件中设置
[ServiceContract(Name="OperateData",Namespace="http://localhost:8008/yoyo")]
public interface IOperateDB
{
/// <summary>
/// 添加商品信息到数据库
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
[OperationContract(Name = "SaveData", Action = "http://localhost:8008/yoyo/IOperateDB/SaveDataToDB", ReplyAction = "http://localhost:8008/yoyo/IOperateDB/SaveDataToDBResponse")]
bool SaveDataToDB(Products obj);
/// <summary>
/// 根据商品ID获取商品信息
/// </summary>
/// <param name="productID"></param>
/// <returns></returns>
[OperationContract(Name = "GetProduct", Action = "http://localhost:8008/yoyo/IOperateDB/GetProductFromDB", ReplyAction = "http://localhost:8008/yoyo/IOperateDB/GetProductFromDBResponse")]
Products GetProductFromDB(int productID);
}
//Name参数表示:此服务在客户端的名字
//Namespace:表示这个服务所在的地址,此处可以写也可不写,这个地址可以在配置文件中设置
[ServiceContract(Name = "OperateData", Namespace = "http://www.zhu/yoyozhu")]
public interface IStudent
{
/// <summary>
/// 添加学生信息
/// </summary>
/// <param name="obj"></param>
/// <returns></returns>
[OperationContract(Name = "SaveData", Action = "http://www.zhu/yoyozhu/IStudent/SaveData", ReplyAction = "http://www.zhu/yoyozhu/IStudent/SaveDataResponse")]
bool SaveData(Student obj);
/// <summary>
/// 根据学生ID获取学生信息
/// </summary>
/// <param name="studentID"></param>
/// <returns></returns>
[OperationContract(Name = "GetStudent", Action = "http://www.zhu/yoyozhu/IStudent/GetStudent", ReplyAction = "http://www.zhu/yoyozhu/IStudent/GetStudentResponse")]
Student GetStudent(int studentID);
}
2.实现接口
public class OperateDB : IOperateDB
{
NorthwindEntities dbContext = new NorthwindEntities();
#region IOperateDB 成员
public bool SaveDataToDB(DataModel.Products obj)
{
try
{
dbContext.AddToProducts(obj);
dbContext.SaveChanges();
return true;
}
catch
{
return false;
}
}
public Products GetProductFromDB(int productID)
{
Products tmp = new Products();
tmp = dbContext.Products.FirstOrDefault(c => c.ProductID == productID);
return tmp;
}
#endregion
}
/// <summary>
/// InstanceContextMode指定可用来处理包含在传入消息中的调用的服务实例数。
/// InstanceContext表示服务实例的上下文信息。
/// </summary>
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class OperateStuInfo : IStudent
{
private Student student;
#region IStudent 成员
public bool SaveData(DataContent.Student obj)
{
student = obj;
if (student != null)
return true;
else
return false;
}
public Student GetStudent(int studentID)
{
return student;
}
#endregion
}
/// <summary>
/// DataContract指定这个类可以由序列化器进行序列化
/// </summary>
[DataContract(Name = "StudentInfo", Namespace = "http://schemas.zhu/yoyozhu")]
public class Student
{
/// <summary>
/// DataMember指定该成员是否要被序列化
/// </summary>
[DataMember(Name="ID",IsRequired=true,Order=0)]
public int StuID { get; set; }
[DataMember(Name = "Name", IsRequired = true, Order = 1)]
public string StuName { get; set; }
[DataMember(Name = "Age", IsRequired = true, Order = 2)]
public int StuAge { get; set; }
[DataMember(Name = "BornDate", IsRequired = true, Order = 3)]
public DateTime StuDateTime { get; set; }
}
3.服务端配置
<connectionStrings>
<add name="NorthwindEntities" connectionString="metadata=res://*/DBModel.csdl|res://*/DBModel.ssdl|res://*/DBModel.msl;provider=System.Data.SqlClient;provider connection string="Data Source=.;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
</connectionStrings>
<system.serviceModel>
<services>
<!--注意服务的名称是具体实现接口的类名称,即具体提供服务的对象-->
<service name="Contracts.OperateDB" behaviorConfiguration="serviceBehavior">
<host>
<baseAddresses>
<add baseAddress="http://localhost:8000"/>
</baseAddresses>
</host>
<!--address:是相对地址,所以这里可以随便写个
binding:传输协议;contract:那个接口协定-->
<endpoint address="OperateDB" contract="Contracts.IOperateDB" binding="basicHttpBinding" />
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
</service>
<service name="Contracts.OperateStuInfo" behaviorConfiguration="serviceBehavior">
<host>
<baseAddresses>
<!--注意:在net.tcp协议下,此处必须指定两个基址,否则出现以下错误:
找不到具有绑定 MetadataExchangeHttpBinding 的终结点的与方案 http 匹配的基址。
注册的基址方案是 [net.tcp]。
-->
<add baseAddress="http://localhost:8028"/>
<add baseAddress="net.tcp://localhost:8029"/>
</baseAddresses>
</host>
<!--address:是相对地址,所以这里可以随便写个
binding:传输协议;contract:那个接口协定-->
<endpoint address="OperateStuInfo" contract="Contracts.IStudent" binding="netTcpBinding" />
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<!--这个Name要和behaviorConfiguration一致-->
<behavior name="serviceBehavior">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
4.客户端配置
<binding name="BasicHttpBinding_OperateData" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
</basicHttpBinding>
<netTcpBinding>
<binding name="NetTcpBinding_OperateData" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
transactionFlow="false" transferMode="Buffered" transactionProtocol="OleTransactions"
hostNameComparisonMode="StrongWildcard" listenBacklog="10"
maxBufferPoolSize="524288" maxBufferSize="65536" maxConnections="10"
maxReceivedMessageSize="65536">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Transport">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign" />
<message clientCredentialType="Windows" />
</security>
</binding>
</netTcpBinding>
<endpoint address="http://localhost:8000/OperateDB" binding="basicHttpBinding"
bindingConfiguration="BasicHttpBinding_OperateData" contract="ServiceReference_ContractDesign.OperateData"
name="BasicHttpBinding_OperateData" />
<endpoint address="net.tcp://localhost:8029/OperateStuInfo" binding="netTcpBinding"
bindingConfiguration="NetTcpBinding_OperateData" contract="StudentService.OperateData"
name="NetTcpBinding_OperateData">
<identity>
<userPrincipalName value="OI7CXRCNM6CGSIS\Administrator" />
</identity>
</endpoint>
5.这些配置可以手动写,也可以使用VS自带的工具进行配置:
首先,启动服务器端,然后在客户端添加服务引用如图:
即可完成服务调用
实例源码:http://download.csdn.net/detail/yoyoshaoye/3614037