您的位置:首页 > 编程语言 > ASP

ASP.NET 3.5核心编程学习笔记(57):针对AJAX应用程序的WCF服务

2011-05-04 14:45 1011 查看
  WCF服务能够输出JSON,通过HTTP进行传输(不一定要用SOAP进行数据包装)。我们要做的是,使端点使用webHttpBinding绑定模型,并通过新的特性来启用Web脚本调用。

构建一个简单的WCF服务

  在VS2008中创建一个新Web站点,添加一个新的WCF服务,并将该项命名为TimeService。

以WCF服务的形式重写TimeService

  添加新项后,我们会发现项目中多了一个服务端点(timeservice.svc),与其相关的代码文件(如wcftimeservice.cs)位于App_Code文件家下。此外,web.config文件也会被修改,用于向系统注册刚刚创建的服务。

  开发者通常应该通过接口来定义服务的协定,虽然并不严格要求这么做,但我们能够通过此方法在同一个类中实现多个协定:

namespace Core35.Services.Wcf
{
//Contract
[ServiceContract(Namespace="Core35.Services", Name="WcfTimeService")]
public interface ITimeService
{
[OperationContract]
DateTime GetTime();
[OperationContract]
string GetTimeFormat(string format);
}
}


  ITimeService接口代表的有服务的协定。ServiceContract特性用于标记协定,OperationContract特性用于标记方法。对于更简单的情况,我们可以用类定义协定(直接使用ServiceContract和OperationContract),并直接实现。

  注意此处ServiceContract特性的Namespace和Name属性值,这两者对支持AJAX的WCF服务有着非常重要的意义。下面是一个实现ITimeService协定的类:

using System;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Activation;
using System.ServiceModel.Web;

namespace Core35.Services.Wcf
{
[AspNetCompatibilityRequirements(
RequirementsMode=AspNetCompatilityRequirementMode.Allowed)]
public class TimeService : ITimeService
{
public DateTime GetTime()
{
return DateTime.Now;
}
public class GetTimeFormat(string format)
{
return DateTime.Now.ToString(format);
}
}
}


  TimeService暴露了两个公共端点,分别为GetTime和GetTimeFormat.

WCF服务的注册

  用于调用该接口方法的端点定义在SVC文件中,如timeservice.svc文件:

<%@ ServiceHost Debug="true" Service="Core35.Services.Wcf.TimeService"
CodeBehind="~/App_Code/WcfTimeService.cs" %>


  ServiceHost指令用于指示源文件的名称和实现该方法的类型。如果服务相关的代码以内联方式置于SVC文件中,则必须另外指定Language属性。

  最后要完成的步骤是在宿主ASP.NET应用程序的web.config文件中注册该服务的使用方式:

<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="TimeServiceAspNetAjaxBehavior">
<enableWebScript>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<services>
<service name="Core35.Services.Wcf.TimeService">
<endpoing address=""
behaviorConfiguration="TimeServiceAspNetAjaxBehavior"
binding="webHttpBinding"
contract="Core35.Services.Wcf.ITimeService" />
</service>
</services>
</system.serviceModel>


  首先,注册这些端点的一系列行为。为此,声明它能够接受通过脚本发起的Web请求。enableWebScript元素在逻辑上等价于修改Web服务类时使用的ScriptService特性。

  随后,我们要列出寄放在当前ASP.NET应用程序中的服务。

服务测试

  我们如何在客户端ASP.NET页面中使用它呢?对于开发者来说,这无异于调用Web服务。

  首先,我们向脚本管理器注册该服务的SVC端点:

<asp:ScriptManager ID="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="~/TimeService.svc" />
</Services>
</asp:ScriptManager>


  处理该脚本时,ScriptManager控件会触发额外的请求,为指定的WCF服务生成和下载JavaScript代理类。

  该代理类的名称取决于协定中ServiceContract特性的Namespace和Name属性。如果不设置这两个属性,保留其默认值,那么这个JavaScript代理类的名称为Tempuri.org.ITimeService,其中Tempuri.org是默认的命名空间,接口的名称即为协定的默认名称。

  服务类的名称与JavaScript代理类的名称间没有关系。

  使用JavaScript调用WCF服务的方法:

<script language="javascript" type="text/javascript">
function getTime()
{
Core35.Services.WcfTimeService.GetTimeFormat("dd-MM-yyyy [hh:mm:ss]", onMethodCompleted);
}
function onMethodComplete(results)
{
$get("lblCurrentTime").innerText = results;
}
</script>


  与ASP.NET AJAX Web服务类似,每个JavaScript代理方法也支持一且额外的参数--用于处理操作成功或失败的回调函数。

ASP.NET兼容模式

  当创建ASP.NET AJAX Web时,服务类默认会由AspNetCompatibilityRequirements特性修饰。

  虽然WCF服务的消息与传输协议无关,但如果它们处于ASP.NET AJAX应用程序的上下文中,其工作方式与ASMX服务非常接近。通过AspNetCompatibilityRequirements属性,我们可使WCF和ASMX服务按同一种模型工作。与ASMX服务兼容使WCF服务能够访问HttpContext对象,进而可以访问其他ASP.NET内部对象。这种兼容性需要在两个层面设置,第一个层面位于web.config文件中,设置其serviceHostingEnvironment节点;第二个层面,开发者需通过AspNetCompatibilityRequirements特性显式地为WCF服务选择兼容模式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐