zoukankan      html  css  js  c++  java
  • 使用多种客户端消费WCF RestFul服务(一)——服务端

    RestFul风格的WCF既然作为跨平台、跨语言、跨技术的一种方式出现,并且在ASP.NET API流行起来之前还是架构的首选技术之一,那么我们就来简要的介绍一下WCF在各个平台客户端的操作。

    开发工具及版本:Microsoft Visual Studio 2013(.net 4.0),jQuery JavaScript Library v1.4.2,

    服务端创建步骤:

    第一步:

    打开vs创建一个类库名为:ILongshi.BIZ。(为何要创建类库而不是WCF类库,是要完全从头开始手动完成所有操作并且加深对WCF的理解)。

    clip_image002

    删除多余的Class1类,创建一个User类,具备ID,NAME,AGE属性,然后为类名加上属性DataContract,字段名加上属性DataMember,

    解释:一旦声明一个类型为DataContract,那么该类型就可以被序列化在服务端和客户端之间传送,只有声明为DataContract的类型的对象可以被传送,且只有成员属性会被传递,成员方法不会被传递。但是默认情况下,所有的成员属性都被排除在外,因此需要把每一个要传送的成员声明为DataMember才能被传递。

    具体代码如:

    [DataContract]
        [Serializable]
        public class User
        {
            [DataMember] 
            public string ID { get; set; }
            [DataMember]
            public string Age { get; set; }
            [DataMember] 
            public string Name { get; set; }
        }

    添加引用的组件有:

    clip_image004

    第二步:

    创建服务契约,创建一个名为UserService的类(这里我们不直接创建接口,但是建议创建成接口,还是那句话,快速构建),然后依次创建4个具有代表性的方法:

    clip_image006

    然后为类加上属性:

    [ServiceContract]

    [AspNetCompatibilityRequirements(RequirementsMode =

    AspNetCompatibilityRequirementsMode.Allowed)]

    再为每一个方法加上属性:

    [OperationContract]

    [WebInvoke]

    解释:[ServiceContract] 这个特性告诉编译器,该类型是一个服务契约,

    [OperationContract] 这个特性告诉编译器,该成员是一个操作契约,

    详细代码如:

    [ServiceContract]
        [AspNetCompatibilityRequirements(RequirementsMode =
            AspNetCompatibilityRequirementsMode.Allowed)]
        public class UserService 
        {
            [OperationContract]
            [WebInvoke(UriTemplate = "GetPerson", ResponseFormat = WebMessageFormat.Json, Method = "GET")]
            public User GetUser()
            {
                return new User {  Age="12", ID="001", Name="zhangsan"};
            }
    
            [OperationContract]
            [WebInvoke(UriTemplate = "GetPersonById/{id}", ResponseFormat = WebMessageFormat.Json, Method = "GET")]
            public User GetUserById(string id)
            {
                return new User { Age = "12", ID = id, Name = "lisi" };
            }
    
    
            [OperationContract]
            [WebInvoke(UriTemplate = "GetPersonPost", ResponseFormat = WebMessageFormat.Json, Method = "POST")]
            public User GetUserPost()
            {
                return new User { Age = "12", ID = "003", Name = "wangwu" };
            }
    
    
            [OperationContract]
            [WebInvoke(UriTemplate = "GetPersonPostById", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json, Method = "POST")]
            public User GetUserPostById(string id, string name, string age)
            {
                return new User { Age = age, ID = id + "server", Name = name };
            }
        }

    前2个方法分别为有参和无参GET方式,后2个分别为有参和无参POST方式。如此服务端就完成了。

    第三步:

    创建宿主和异形一样,没有母体他没办法运行,这里我们将宿主创建成网站,那么请在解决方案管理器中右键,然后创建一个WEB空应用程序。

    clip_image008

    然后添加对刚才类库的引用

    clip_image010

    打开Web.config在configuration节点下system.web节点上创建system.serviceModel节点,依次增加需要的其他配置,具体代码如下:

    详细代码:

    <system.serviceModel>
        <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true">
          <serviceActivations>
            <add relativeAddress="UserService.svc" service="ILongshi.BIZ.UserService"/>
          </serviceActivations>
        </serviceHostingEnvironment>
        <behaviors>
          <serviceBehaviors>
            <behavior name="">
              <serviceMetadata httpGetEnabled="true"/>
              <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
          </serviceBehaviors>
          <endpointBehaviors>
            <behavior name="BehaviorConfig">
              <webHttp helpEnabled="true"/>
            </behavior>
          </endpointBehaviors>
        </behaviors>
        <services>
          <service name="ILongshi.BIZ.UserService">
            <endpoint address="" behaviorConfiguration="BehaviorConfig" binding="webHttpBinding" contract="ILongshi.BIZ.UserService"/>
          </service>
        </services>
      </system.serviceModel>

    解释:默认情况下ASP.NET兼容性支持是关闭的,但很多时候需要打开Asp.Net的兼容性来利用Asp.Net的一些特性(使用session,上下文等),具体可参考http://msdn.microsoft.com/zh-cn/library/ms752234.aspx。

    如果要打开兼容性,需要做两步:一是在服务类加上如下标记:

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]

    public class AppRuntimeStateSvc : IAppRuntimeStateSvc

    {

    //服务代码.

    }

    二是在web.config中的<system.serviceModel>段里加:

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />

    注意框架3.5以前都是默认就支持的,4.0以后默认就是没有打开兼容性支持的。

    includeExceptionDetailInFaults要接收故障异常详细信息以进行调试,请将以下值设置为 true。在部署前设置为 false 以避免泄漏异常信息

    将httpGetEnabled设置为true,使客户端能够成功捕获服务

    其余就是标准绑定了,如果address值为空,那么endpoint的地址就是默认的基地址(Base Address)。

    第四步:

    查看服务,将项目WEBHOST设置为启动项目,然后F5,在自动生成的网址后面加上配置的服务名,一切正常的话会出现这个页面:

    clip_image012

    试着访问下第一个服务,在地址后面加上操作名,如http://localhost:3720/userService.svc/GetPerson

    将会出现:(建议使用火狐或者GOOGLE浏览器调试IE地址栏显示不全)

    clip_image014

    能看到这个就证明服务发布OK了,并且返回的是JSON格式。

    本节源代码:下载

  • 相关阅读:
    字符编码笔记:ASCII,Unicode 和 UTF-8
    nginx 负载均衡设置
    ubuntu 修改时区
    js 高阶函数 filter
    js 高阶函数 map reduce
    省市联级菜单--js+html
    php代码优化技巧
    json、xml ---- 数据格式生成类
    初识设计模式(1)---单例、工厂、注册树
    php 链式操作的实现 学习记录
  • 原文地址:https://www.cnblogs.com/madyina/p/3454741.html
Copyright © 2011-2022 走看看