在工作中学习到两个知识点,如标题所示,在此记录一下,方便日后使用。
首先贴上项目结构截图:
首先说基于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服务的配置都是在此节点中进行的。
我们要实现基于Rest的Wcf服务,需要在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调用代码:
发现服务并没有好用,但是把项目发布到IIS上,会发现服务是好用的,能按预期的弹出"wcf test is successful",本地调用服务不其作用,发布到IIS上就起作用了,这是为什么呢?原因还是出在web.config文件的配置上,在 <system.web>节点下要增加<authentication mode="Forms"></authentication>节点(有人说这个节点应该是系统自动生成的,但是我发现我的web.config中并没有自动生成此节点,难道是我的操作不当?),这个节点是asp.net身份验证用的,具体作用查询官网文档.增加这个节点后,我们发现本地服务也能调用了。至此全部配置完毕。
下篇博文记录iBatisNet框架的配置使用