zoukankan      html  css  js  c++  java
  • 项目中基于Rest的Wcf服务发布以及iBatisNet框架的使用(上)

    在工作中学习到两个知识点,如标题所示,在此记录一下,方便日后使用。

    首先贴上项目结构截图:

    首先说基于Rest的Wcf服务发布,主要记录如何在web.config中进行配置。在项目中添加Wcf服务文件(.svc文件),添加成功后把IWcfService.cs删去(当然也可以不删,根据个人使用习惯),然后把WcfService.svc.cs中的代码稍作修改,改完后的代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;

    namespace MyProject.Web.Web.WcfService
    {

    [ServiceContract]
    public class WcfService
    {
    [OperationContract]
    public void DoWork()
    {
    }
    }
    }

    然后,去看添加完.svc文件后的web.config文件,发现增加了system.serviceModel节点,wcf服务的配置都是在此节点中进行的。

      <system.serviceModel>
    <behaviors>
    <serviceBehaviors>
    <behavior name="">
    <serviceMetadata httpGetEnabled="true" />
    <serviceDebug includeExceptionDetailInFaults="false" />
    </behavior>
    </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
    </system.serviceModel>

    我们要实现基于Rest的Wcf服务,需要在system.serviceModel节点中进行配置,配置完全后的代码如下:具体各节点的作用可网上搜索相关技术文档

      <system.serviceModel>
    <behaviors>
    <endpointBehaviors >
    <behavior name="AllenBehavior">
    <webHttp/>
    <enableWebScript/>
    <dataContractSerializer maxItemsInObjectGraph="2147483647"/>
    </behavior>

    </endpointBehaviors>
    <serviceBehaviors>
    <behavior name="">
    <serviceMetadata httpGetEnabled="true" />
    <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
    </serviceBehaviors>
    </behaviors>

    <bindings>
    <webHttpBinding>
    <binding name="HttpJsonpBinding" crossDomainScriptAccessEnabled="true" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" >
    <readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647"/>
    <security mode="None"></security>
    </binding>
    </webHttpBinding>
    </bindings>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" aspNetCompatibilityEnabled="true" />

    <services>
    <!--service节点的name属性设置为实现服务的类的名称,并包含它的命名空间在内(即命名空间+类名)。-->
    <service name="MyProject.Web.Web.WcfService.WcfService">
    <endpoint address="" binding="webHttpBinding" behaviorConfiguration="AllenBehavior" contract="MyProject.Web.Web.WcfService.WcfService" bindingConfiguration="HttpJsonpBinding" >

    </endpoint>
    </service>
    </services>
    </system.serviceModel>

    其中注释部分为特别需要注意的地方,实现服务的类的名称一定要命名空间名+类名。配置好后,我们还要在WcfService.svc.cs中进行相应改动,改动完后的代码:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    using System.ServiceModel.Activation;
    using System.ServiceModel.Web;

    namespace MyProject.Web.Web.WcfService
    {

    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]//如果不加此属性,将出现兼容性错误
    [JavascriptCallbackBehavior(UrlParameterName = "personCallBack")]//jsonp跨域定义的类名
    public class WcfService
    {
    [WebGet(ResponseFormat = WebMessageFormat.Json)]
    public string DoWork()
    {
    return "wcf test is successful";
    }
    }
    }

    与改动前的代码相比,有几个地方的改动:首先,在[ServiceContract]下边增加了[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)],这是保证运行兼容性的,如果不加将出现兼容性错误。同时,命名空间需对应增加

    using System.ServiceModel.Activation;其次,增加了[JavascriptCallbackBehavior(UrlParameterName = "personCallBack")],这个属性的作用是用来jsonp跨域访问的,

    personCallBack为jsonp跨域定义的类名(原则上可以随便取),前台ajax调用时jsonp属性对应的值应该跟此类名相同。要增加此属性需在项目中 添加引用->在.Net选项中找到System.ServiceModel.Web的组件,然后using System.ServiceModel.Web;最后的改动,是把   [OperationContract]替换成了[WebGet(ResponseFormat = WebMessageFormat.Json)],这是因为基于rest的wcf增加了WebGet和WebInvoke两个属性,具体作用可以查阅相关文档。WebInvoke的配置:

     [WebInvoke(Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)],注意Method = "POST",

    post必须为大写,不然可能会出错。

    至此,基于rest的wcf服务已经基本配置完毕,在前台写ajax调用代码:

    <script type="text/javascript">
    function GetResult() {
    $.ajax({ dataType: 'json', //写死的类型表示 json
    //data: 'i=1', //页面参数
    jsonp: 'personCallBack', //类名返回
    url: 'WcfService.svc/DoWork?personCallBack=?',
    contentType: "application/json",
    success: function (msg) {
    if (msg && msg != "") {
    alert(msg);
    } else {
    alert("服务器超时,或者暂无数据,或者发生读取异常");
    }
    }
    });
    }
    </script>

    发现服务并没有好用,但是把项目发布到IIS上,会发现服务是好用的,能按预期的弹出"wcf test is successful",本地调用服务不其作用,发布到IIS上就起作用了,这是为什么呢?原因还是出在web.config文件的配置上,在 <system.web>节点下要增加<authentication mode="Forms"></authentication>节点(有人说这个节点应该是系统自动生成的,但是我发现我的web.config中并没有自动生成此节点,难道是我的操作不当?),这个节点是asp.net身份验证用的,具体作用查询官网文档.增加这个节点后,我们发现本地服务也能调用了。至此全部配置完毕。

    下篇博文记录iBatisNet框架的配置使用


     



     

  • 相关阅读:
    尝试Spring Data Jpa--告别CRUD
    SSM框架开发web项目系列(七) SpringMVC请求接收
    SSM框架开发web项目系列(六) SpringMVC入门
    SSM框架开发web项目系列(五) Spring集成MyBatis
    SSM框架开发web项目系列(四) MyBatis之快速掌握动态SQL
    SSM框架开发web项目系列(三) MyBatis之resultMap及关联映射
    SSM框架开发web项目系列(二) MyBatis真正的力量
    从MVC到Ajax再到前后端分离的思考
    SSM框架开发web项目系列(一) 环境搭建篇
    antd4.0 定制主题
  • 原文地址:https://www.cnblogs.com/arthur20101108/p/2334787.html
Copyright © 2011-2022 走看看