在工作中学习到两个知识点,如标题所示,在此记录一下,方便日后使用。
首先贴上项目结构截图:
首先说基于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框架的配置使用