ASP.NET Ajax =》WCF(.NET 3.5 Beta 2,VS2005)

本文的主要内容是通过ASP.NET Ajax调用WCF(Windows Communication Foundation)服务的代码示例。(ASP.NET Ajax 1.0与3.5都可以调用)

写这篇文章是源于想用ASP.NET Ajax + WCF来改造博客园的收藏功能。

开发环境是:.NET Framework 3.5 Beta 2+Visual Studio 2005。

准备:

1、安装.NET Framework 3.5 Beta 2

ASP.NET Ajax调用WCF服务需要.NET Framework 3.5 Beta 2中的System.Web.Extensions.dll(3.5.0.0),System.ServiceModel.Web.dll支持。

开始我安装的是.NET Framework 3.5 June 2007 Community Technology Preview (CTP),走了一些弯路。

2、安装Visual Studio 2005 extensions for .NET Framework 3.0 (WCF & WPF)

3、检查IIS是否有.svc到c:\windows\microsoft.net\framework\v2.0.50727\aspnet_isapi.dll的映射,如果没有,建立映射,建立时取消“检查文件是否存在”的选择。

开始:

1、在VS 2005中新建一个Web Site项目。

添加web.config,将<authentication mode="Windows" />改为<authentication mode="Forms" />。

2、在该项目中添加一个WCF Service,命名为CNBlogsWCFService.svc。

image

image

3、修改App_Code中CNBlogsWCFService.cs的代码:

[ServiceContract(Namespace = "http://www.cnblog.com/")]
public interface ICNBlogsWCFService
{
    [OperationContract]
    string AddToFavorites(string blogID, string postID);
}

public class CNBlogsWCFService : ICNBlogsWCFService
{
    public string AddToFavorites(string blogID, string postID)
    {
        return string.Format("收藏成功!BlogID:{0},PostID:{1}", blogID, postID);
    }
}

如果想进一步了解上述代码,请参考:

Artech[原创]我的WCF之旅(1):创建一个简单的WCF程序

Bruce ZhangWindows Communication Foundation入门(Part Two)

4、修改CNBlogsWCFService.svc的代码:

增加:Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory。

改为:<%@ ServiceHost Language="C#" Debug="true" Service="CNBlogsWCFService" CodeBehind="~/App_Code/CNBlogsWCFService.cs" Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"%>

Factory是.NET Framework 3.5 Beta 2中增加的,而我们用的是Visual Studio 2005 extensions for .NET Framework 3.0,所以要手动加上。

如果不通过Ajax调用WCF,需要设置为:Factory="System.ServiceModel.Web.WebServiceHostFactory"。

5、开始第一次运行,访问http://localhost/AjaxWCFDemo/CNBlogsWCFService.svc,会出现如下页面:

image

6、继续运行,访问http://localhost/AjaxWCFDemo/CNBlogsWCFService.svc/js,你会看到自动生成访问WCF的客户端代理脚本。

7、OK!服务器端的WCF已经准备好了,下面就开始客户端的访问。

8、配置ASP.NET Ajax,在web.config中进行设置:

<?xml version="1.0"?>
<configuration>  
  
<appSettings/>
  
<connectionStrings/>
  
<system.web>
    
<compilation debug="false">
      
<assemblies>
        
<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      
</assemblies>
    
</compilation>
    
<authentication mode="Forms" />
    
<httpHandlers>
      
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
      
<add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" validate="false"/>
    
</httpHandlers>
    
<httpModules>
      
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
    
</httpModules>
  
</system.web>
</configuration> 

注意:要设置为3.5版本的System.Web.Extensions,如果使用asp.net ajax 1.0会得不到调用WCF服务返回的结果。

后来发现可以使用asp.net ajax 1.0调用WCF的服务,只需要对返回结果稍做处理,请看文后的补充说明。

9、修改default.aspx的代码:

1)添加ScriptManager,将ServiceReference设置为:~/CNBlogsWCFService.svc。

2)将<%@ Register Assembly="System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"
    Namespace="System.Web.UI" TagPrefix="asp" %>

改为:

<%@ Register Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"
    Namespace="System.Web.UI" TagPrefix="asp" %>

2)添加调用WCF服务的代码,完整代码如下:

<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
<%@ Register Assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"   Namespace="System.Web.UI" TagPrefix="asp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    
<title>Ajax WCF 演示 - 博客园 - www.cnblogs.com</title>
</head>
<body>
    
<form id="form1" runat="server">
    
<div align="center" style="margin-top:50px">
        
<asp:ScriptManager ID="ScriptManager1" runat="server">
            
<Services>
                
<asp:ServiceReference Path="~/CNBlogsWCFService.svc" />
            
</Services>
        
</asp:ScriptManager>
        
<href="#" onclick="AddToFavorites('1','2')">博客园收藏</a><br />
        
<br />
        
<span style="color:Red" id="Msg"></span> 

        
<script type="text/javascript">
        
function AddToFavorites(blogID,postID)
        {
            
var wcf = new www.cnblog.com.ICNBlogsWCFService();
            wcf.AddToFavorites(blogID,postID,OnSucceeded);
        }
        
function OnSucceeded(result)
        {    
            document.getElementById(
"Msg").innerHTML = result;         
        }   
        
</script> 

    
</div>
    
</form>
</body>
</html>

10、一切就绪,体验一下Ajax调用WCF的快乐!

访问http://localhost/AjaxWCFDemo/default.aspx,点击“博客园收藏”:

image 

示例代码下载:AjaxWCFDemo.zip

注:如果出现“IS 指定了身份验证方案“IntegratedWindowsAuthentication, Anonymous”,但绑定仅支持一种身份验证的规范。有效的身份验证方案为摘要、协商、NTLM、基本或匿名。请更改 IIS 设置,以便仅使用单一的身份验证方案。”的错误,请在“目录安全性”中取消集成Windows验证,并重启IIS。

补充:

在asp.net ajax 1.0中是可以调用WCF服务的,只要解决一个小问题,处理一下返回结果就行了。

对于上面的示例,如果用asp.net ajax 3.5调用,OnSucceeded(result)中result的值就是WCF服务ICNBlogsWCFService返回的结果:收藏成功!BlogID:1,PostID:2!

而如果用asp.net ajax 1.0调用,result的值却是{"d":"收藏成功!BlogID:1,PostID:2!"},所以需要通过result['d']得到返回结果。

--------------------------------------------------------------------------------
ASP.NET Ajax+WCF参考文章:
Configuration Free JSON with WCF and AJAX in Visual Studio 2008 Beta 2
WCF, ASP.NET AJAX, and JavaScript Proxies

WCF参考文章:
Bruce Zhang
    Windows Communication Foundation入门(Part One)
    Windows Communication Foundation入门(Part Two)
    Windows Communication Foundation入门(Part Three)
    Windows Communication Foundation之旅(Part Four)
Artech[原创]"我的WCF之旅"系列阶段性总结

Blog:
http://hyperthink.net/blog/ (Program Manager in the Distributed Systems Group over at Microsoft)
http://blogs.msdn.com/drnick/

微软代码示例:
Picture Services shows off WCF Web Programming
WCF / WPF Chat Application

posted @ 2007-09-28 13:58 dudu 阅读(4096) 评论(33)  编辑 收藏 网摘 所属分类: WCF

  回复  引用  查看    
#1楼 2007-09-28 14:12 | aspnetx      
老大好久不出来冒泡了
支持一下
  回复  引用  查看    
#2楼 [楼主]2007-09-28 14:29 | dudu      
好想经常出来冒泡,学习学习新技术,写写东西,写文章是一种很好的学习与提高方法。
可是现在这样的想法已经是一种奢侈,只能通过读大家的文章进行学习。

  回复  引用  查看    
#3楼 2007-09-28 14:37 | 木野狐(Neil Chen)      
关注 WCF
  回复  引用  查看    
#4楼 2007-09-28 15:27 | 南疯      
DUDU的心情我理解,目前自己也很想去写技术文章,可是身子已经不是自己了。每天管理、协调的一大堆问题需要自己去解决(本人同时负责两个项目)。所关注的事情已经不是那么细节了。害得那天我手下一个开发人员用疑惑的眼光看了我好久:你说这个功能20行代码之内实现,你会写代码么?
看着他疑惑的眼光,我冒出了一身冷汗,工作第十个年头的今天的我,已经离他们很远了!
明天去参加一个很大公司的技术经理的面试,希望借DUDU的帖子给自己增加运气!

  回复  引用  查看    
#5楼 [楼主]2007-09-28 15:51 | dudu      
@南疯
祝你好运!
  回复  引用  查看    
#6楼 2007-09-28 16:01 | xiao_p      
难得看见dudu老大有空出来发表个技术文章,呵呵。 顶下

  回复  引用  查看    
#7楼 2007-09-28 16:52 | 高海东      
我也在研究wcf 建议dudu把博客园的查询功能在做的好些,比如按照标题 发表日期范围,类别等条件
  回复  引用  查看    
#8楼 2007-09-28 16:58 | Dflying Chen      
难得看到技术文章,呵呵

  回复  引用  查看    
#9楼 2007-09-28 18:14 | Clark Zheng      
果然高手!!
  回复  引用  查看    
#10楼 2007-09-28 18:20 | 钢钢      
关注 ASP.NET Ajax
  回复  引用  查看    
#11楼 [楼主]2007-09-28 18:51 | dudu      
@高海东
目前用的是google站内搜索。
搜索功能已在开发计划中,正在加快开发进度。
  回复  引用  查看    
#12楼 2007-09-28 20:53 | Zhuang miao      
DuDu可真有经历...还有空写技术文章,你快成超人了!!
  回复  引用  查看    
#13楼 2007-09-28 22:29 | t-mac.NET      
@亚历山大同志,
马甲?

  回复  引用  查看    
#14楼 2007-09-29 01:04 | volnet(可以叫我大V)      
DUdu辛苦了哦`
  回复  引用  查看    
#15楼 2007-09-29 01:41 | Jeffrey Zhao      
其实我觉得,为啥要用WCF释放出的Service供ASP.NET AJAX调用呢?其实要知道这里可以说没有用任何WCF的东西。为什么呢?看看是怎么实现的就知道了,其实只是自定义了一个svc的Compiler,然后选择合适的Compile方式来处理代码。我觉得ASP.NET AJAX调用WCF只能说是技巧,而不是方法,因为它没有带来任何好处。简单的说,WCF是开发分布式服务的技术,它在开发服务时(一定程度上)其实忽视客户端的请求方式。但是ASP.NET AJAX是纯Web开发,也就是WCF中如果直接与Web开发功能耦合会显得非常尴尬。
我想说的意思总之一句话,这里真的没有WCF的特性,这里套上WCF真的很假。最近实在太忙了,有时间我会写篇文章谈一下这个话题……
不过可以看出,微软已经要把WCF作为.NET平台下的通信技术标准了……
  回复  引用  查看    
#16楼 2007-09-29 01:41 | Jeffrey Zhao      
dudu准备如何实现搜索亚?
  回复  引用  查看    
#17楼 2007-09-29 02:05 | Zhuang miao      
@Jeffrey Zhao
分析的Good!
  回复  引用  查看    
#18楼 2007-09-29 10:41 | 小庄      
请教:第一次访问那个SVC的时候正常,第二次怎么变成:
在基址“http://localhost:3315/WCFService/WCFAjaxService.svc”检测到 ID 为“f42fb4ae-8cd2-4af4-bab1-c1ff5a1434f7”且名称为“WSHttpBinding_IWCFAjaxService”的现有终结点。WebScriptServiceHostFactory 无法在同一地址创建另一个终结点。请删除现有终结点、更改其地址或更改基址的集合。??
怎么办?在哪里删除?
  回复  引用  查看    
#19楼 [楼主]2007-09-29 11:06 | dudu      
@Jeffrey Zhao
如果不用WCF,就要用WebService,而我想在博客园统一使用WCF提供服务接口,有些接口准备对外开放,如果这里不用WCF,就得既写WebService,又要写WCF。
这里WCF释放出的Service不是只给ASP.NET AJAX调用的,ASP.NET AJAX调用只是客户端调用方式之一。
ASP.NET AJAX调用WCF恰恰体现了WCF的优势,WCF怎么会与Web开发功能耦合,WCF天生就是不与客户端耦合的,比如文章中的例子,可以轻松地实现通过WinForm调用收藏功能。
  回复  引用  查看    
#20楼 2007-09-29 11:36 | Jeffrey Zhao      
@dudu
我的意思是,WCF不应该与Web开发功能耦合,因为它其实完全忽视通信方式。但是ASP.NET AJAX是纯粹的Web开发,所以我也一直建议是为ASP.NET AJAX重写Web Service方法而不是用之前已有的,例如供SOAP调用的asmx文件。
  回复  引用  查看    
#21楼 2007-09-29 11:37 | Jeffrey Zhao      
不过统一用WCF也是一个不错的设想吧,但是这样的话一些与Web耦合度高的逻辑就要放到其它地方去了……
  回复  引用  查看    
#22楼 [楼主]2007-09-29 11:39 | dudu      
@小庄
你直接在IIS中运行试试。
  回复  引用  查看    
#23楼 [楼主]2007-09-29 11:39 | dudu      
@Jeffrey Zhao
准备用lucene.net。
  回复  引用  查看    
#24楼 [楼主]2007-09-29 11:45 | dudu      
@Jeffrey Zhao
不知道你是指哪个地方与Web开发功能耦合了,WCF本来就支持多个Host环境,现在只不过让WCF运行于Web Host环境。
  回复  引用  查看    
#25楼 [楼主]2007-09-29 11:50 | dudu      
--引用--------------------------------------------------
Jeffrey Zhao: 不过统一用WCF也是一个不错的设想吧,但是这样的话一些与Web耦合度高的逻辑就要放到其它地方去了……
--------------------------------------------------------
与Web耦合度高的逻辑本来就在其他地方,WCF只是提供一些服务接口,Web层可以调用这些接口。
  回复  引用    
#26楼 2007-09-29 23:20 | sadfs [未注册用户]
问大家一个无关的问题:怎么申请博客啊?
  回复  引用    
#27楼 2007-09-30 10:53 | 路过 [未注册用户]
@sadfs
写个申请,签上你的大名,交给党。
  回复  引用    
#28楼 2007-09-30 11:58 | br [未注册用户]
这个wcf 的forms 验证如何实现呢
  回复  引用  查看    
#29楼 2007-09-30 12:42 | jisen      
第一次看到啊!
  回复  引用  查看    
#30楼 2007-10-10 11:47 | chy710      
@dudu
发现园子里有个问题呀,团队及俱乐部的blog左上角的链接"博客园首页",连接的地址不是园子首页,而是本blog....
  回复  引用  查看    
#31楼 [楼主]2007-10-10 12:28 | dudu      
@chy710
谢谢你发现这个问题,现在好了。
  回复  引用  查看    
#32楼 2007-11-02 16:21 | Hkicr      
博主厉害,向你学习.

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-10-02 14:23 编辑过
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: