在项目中用过一些WCF的技术
这篇文章是对以前用过的一点东西的一个梳理一,webconfig的配置
除了一般的配置外,与WCF相关的配置如下 <system.serviceModel> <behaviors> <endpointBehaviors> <behavior name="AllenBehavior"> <enableWebScript /> behavior> endpointBehaviors> behaviors> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> <services> <service name="jqueryWCF.WCFservice"> <endpoint address="" behaviorConfiguration="AllenBehavior" binding="webHttpBinding" contract="jqueryWCF.WCFservice" /> service> services> system.serviceModel>
其中节点中的name属性,是实现了服务契约的类型名,类型名必须是完整的,要包括名称空间
节点的address属性为空,说明使用基地址.behaviorConfiguration属性与behavior节点的name属性相匹配binding属性说明WCF服务使用什么协议,这里是HTTP协议contract属性是描述契约的接口名称,也必须是完整的.如果没有接口直接写实现契约的类型名也可以(我这里就是这样). 节点的信息是描述WCF服务端的一些特性,行为的
name属性与前面说的behaviorConfiguration属性一致 节点使我们的WCF支持ajax 与后端的AspNetCompatibilityRequirements配合使用
二:页面中的js代码 这段JS是写在JQUERY框架下面的
function callServer(){ var id = Number($("#id").val()); var title = String($("#title").val()); var content = String($("#content").val()); $.ajax({ type: 'post', url: '/WCFservice.svc/InsertRow', contentType: 'text/json', data: '{"id":'+id+',"title":"'+title+'","content":"'+content+'"}', success: function(msg) { var a = eval('('+msg+')'); if(String(a.d).length>0){alert(a.d);} else{alert("服务器超时");} } }); }
其中 $.ajax(.....)是框架提供的一个调用ajax的方法,兼容目前大多数浏览器
url: '/WCFservice.svc/InsertRow' 这里是WCF的地址+方法名
contentType: 'text/json',
这是以JSON的方式POST数据,当然也可以用XML的方式(要配合WCF后端的定义)
data: '{"id":'+id+',"title":"'+title+'","content":"'+content+'"}',
数据必须按照InsertRow方法的签名传递(这里稍有不慎就出错了,而且js的调试比较难搞)
success: function(msg) {}
成功后的回调函数,msg参数是一个object类型的,要eval()一下才能得到里面的数据
三:后端WCF代码
using System; using System.Linq; using System.Runtime.Serialization; using System.ServiceModel; using System.ServiceModel.Activation; using System.ServiceModel.Web; namespace jqueryWCF { [ServiceContract(Namespace = "")] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class WCFservice { [OperationContract] [WebInvoke(RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)] public string InsertRow(int id,string title,string content) { return string.Format("您输入的标题是:{0}\n\n您输入的内容是:{1}\n\n此文章的id是:{2}",title,content,id.ToString()); } } }
系统要引用System.ServiceModel.Web的DLL默认是不引用的 ServiceContract属性把此类型公开在WCF服务中
AspNetCompatibilityRequirements属性确保端点使用了WEBHTTP绑定模型 与webconfig中的配合使用 OperationContract属性把方法公开在WCF服务中 RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json 说明传递近来的数据都是JSON形式的,只有两种形式,一个是JSON,一个是XML. (我觉得JSON更"对象"一点,XML更"数据"一点)
BodyStyle = WebMessageBodyStyle.WrappedRequest
是把参数包装一下 这样可以传递多个参数进来,
我猜返回值之所以是一个javascript的对象(json流得来的对象)也是因为这里 项目示例: