WCF学习笔记(二)使用Name等属性和数据契约

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=&quot;Data Source=.;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;MultipleActiveResultSets=True&quot;" 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

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值