Feng's profileLudwig的骇客帝国BlogLists Tools Help

Blog


    March 19

    M$ ASP.NET AJAX注册脚本

    用户自定义控件中的UpdatePanel里放入了一个GridView, 然后GridView里有一个ImageButton. 点击ImageButton后希望能返回成功的MessageBox.

    本来在GridView里的Command事件回调函数中使用:

    ScriptManager.RegisterStartupScript(this, this.GetType(), "gvPending_Command_ShowMessage", "alert('加入成功!');", true);

    不行, 后来改用

    ScriptManager.RegisterStartupScript(this.Page, this.Page.GetType(), "gvPending_Command_ShowMessage", "alert('加入成功!');", true);

    就成功了.

    现在还不清楚RegisterStartupScript第一个参数的用处, 该参数的类型是Page或者Control.

    February 05

    对《Understanding Single Sign-On in ASP.NET 2.0》一文的补充 --- 引用自http://blog.joycode.com/dotey/

    今日偶然阅读了Understanding Single Sign-On in ASP.NET 2.0 这篇关于单点登录的文章,仔细阅读,发现还是有些不尽完整之处。

    文中对于单点登录的介绍,忽略了一个重要问题——就是站点的域的问题。在深入讨论这个问题之前,先简单介绍一下网站域的概念,举个例子,假如我们有三个站点:
    A: blog.joycode.com; B: beta.joycode.com; C: www.openlab.net.cn 。那么A站点的域是"blog.joycode.com",它的主域是"joycode.com";B站点的域是"beta.joycode.com",它的主域是"joycode.com";C站点的域是"www.openlab.net.cn" ,它的主域是"openlab.net.cn"。对于A和B来说,他们是不同的网站域,但是主域是相同的,都是"joycode.com",对于A和C来说,不管是域还是主域,都不相同。一般我们所说的单点登录,都是指A,B,C这三类站点可以在一点登录,实现所有的站点都不需要再次登录,甚至于不仅限于网站之间,也可能是从其他客户端到网站。一般比较大的系统都需要这样的单点登录系统,例如著名的微软的Passport,还有飞信的SSO。

    回过头来看这篇单点登录文章,按照这种方案,仅能实现同一域下各虚拟目录的单点登录,离真正的单点登录还差得远,当然,文章的思路,对于同一域下的虚拟目录,或者同一主域的不同站点,还有有意义的。

    前面说到了文章中的方案还只能实现同一域下的不同虚拟目录的单点登录,还不能实现同一主域的单点登录,那么怎么样才能在这个方案基础上实现同一主域的不同站点的单点登录呢?

    文章的核心部分在于让每个站点的MachineKey保持一致,采用Form验证,这样可以保证每台服务器Cookie加密解密的结果是一致的。Form验证将登录后的授权凭证加密后保存在Cookie中,由于同一域下面的虚拟目录,Cookie是可以共享的,因此可以同一域内直接实现单点登录,而对于不同域,Cookie是不能直接共享的,所以对于不同域而同一主域的情况,我们还需要将Cookie的domain设为主域。那么还以前文的A、B站点为例,要实现单点,我们只要在web.config中,配置authentication \forms节点下domain值为主域,如下:
    <authentication mode="Forms"> <forms loginUrl="login.aspx" name=".ASPXAUTH" domain="joycode.com"/> </authentication>
    即可实现同一主域不同子域站点之间共享登录了。

    而对于不同主域的站点,实现方案相对就复杂多了。

    December 19

    使用 Request.QueryString 接受参数时,跟编码有关的一些问题

     摘自蝈蝈俊.net

    2007年12月7日 15:22 - (阅读:2080;评论:15)

    我们先来看以下几个请求,看a.aspx 页面用Request.QueryString接受到的是啥信息?

      页面URL Request.QueryString["info"]接受到的值
    案例一 a.aspx?info=%25

    %

    案例二 a.aspx?info=%bc%bc%ca%f5

    ????

    情况分析:

    案例一

    a.aspx?info=%25 为何 Request.QueryString["info"]接受到的值是 % ,而不是 %25,是因为Request.QueryString 替我们在接受到值后,做了一次URL解码。 HttpUtility.UrlDecode("%25")  的计算结果就是 %

    上面的这个案例一虽然看起来很简单。但是我们在一些特殊场景时候,就会因为这个而极度郁闷。

    比如以下几种情况:

    你有一个自己的加密算法,而这个加密算法,某些情况下会计算出带百分号的结果,而这个结果你是要通过URL参数的方式传递给其它页面的。
    这时候你就苦恼的发现,某些时候某个功能就不能用。

    如果解决案例一碰到的情况呢?

    解决方案一:

    把需要传递的参数传递前作一次 HttpUtility.UrlEncode ,
    记得是按照 UTF-8 的编码的 UrlEncode 。这样如果我们希望客户端接受到的是 %25  就应该传递的是 %2525 。

    切记,不可在接受方每次接受后,自作聪明的都做一次 UrlEncode 。而是在发送方做 UrlEncode 。
    如果接受方接受后作 UrlEncode 的话,就会出现下面情况:
    发送方发送 a.aspx?info=%25 ,这时候如果接受方  接受后作 UrlEncode 的话,一切正确
    发送方发送 a.aspx?info=% ,这时候如果接受方  接受后作 UrlEncode 的话,则就乱了。

    另:这套方案中切记, UrlEncode  和 UrlDecode 的次数应该一一对应。不能多一次,也不能少一次。
    有人就会说,这还会出现次数不对应么? 比如下面情况,一个不留意就很可能出现次数不对应。而出现不是你所期望的情况。
    比如我们有这样类似的功能:

    a.aspx 页面中,根据传入的 from 参数,自动跳转到 from 参数(用Request.QueryString["from"]来接受这个参数)设置的页面。
    b.aspx 页面也是同样的逻辑,根据传入的 from 参数(用Request.QueryString["from"]来接受这个参数),自动跳转到指定的页面。
    c.aspx 页面也是同样的逻辑,根据传入的 from 参数(用Request.QueryString["from"]来接受这个参数),自动跳转到指定的页面。


    这样我们就可能书写下面的链接地址:
    a.aspx?from=b.aspx 
    a.aspx?from=b.aspx?from=c.aspx
    a.aspx?from=b.aspx?from=c.aspx?from=http://blog.joycode.com/ghj/

    下面再复杂一点,我给下面几个链接,其中都有 a 这个参数,请告诉我 a 这个参数是被那个页面接受到了?
    说明:  HttpUtility.UrlEncode("&")  == "%26"     HttpUtility.UrlEncode("%")  == "%25"

    地址 a 参数会被那个页面接受到
    a.aspx?from=b.aspx?from=c.aspx&a=1 a 参数被 a.aspx 页面接受到了
    a.aspx?from=b.aspx?from=c.aspx%26a=1 a 参数被 b.aspx 页面接受到了
    a.aspx?from=b.aspx?from=c.aspx%2526a=1 a 参数被 c.aspx 页面接受到了

    如果想不明白,就想想下面这句话
    每一次用 Request.QueryString 获取参数时候,就作了一次 HttpUtility.UrlDecode。

    解决方案二:

    不用 Request.QueryString ,而是自己实现一个获取查询参数的方法。细节我在案例二讲完后再告诉大家,因为这个解决方案也处理了案例二的一些情况。

    案例二

    a.aspx?info=%bc%bc%ca%f5 传给我们的信息其实是使用 GB2312 编码后的“技术” 这两个汉字。
    不信,你可以用下面表达式计算的结果就是 %bc%bc%ca%f5
    HttpUtility.UrlEncode("技术", System.Text.Encoding.GetEncoding("GB2312"))

    ASP.net 系统内部,在处理 Request.QueryString 等情况时候,都是使用的 UTF-8 的编码,我们如果不存在多系统并存的问题时候,这个问题一点都不存在。
    但是,当需要跟其它系统交互式后,问题就可能会出现。
    如果你不了解案例二这里情况时,你就会被这个问题苦恼死。

    比如下面这两个地址提到的问题:

    ASP.net中的Server.UrlEncode函数和ASP中的Server.URLEncode函数返回的值竟然不一样
    http://blog.joycode.com/ghj/archive/2003/10/20/2992.aspx

    PHP与aspx之间中文通过URL如何传递?
    http://topic.csdn.net/u/20071018/19/8a4066af-a08c-4214-91e9-ed4caf977e07.html

    案例二的解决方案
    使用带编码的 HttpUtility.ParseQueryString 函数

    就是采用类似下面代码的方式,来获得指定格式编码的查询文本参数。

               System.Collections.Specialized.NameValueCollection nv =
    System.Web.HttpUtility.ParseQueryString(Request.Url.Query, System.Text.Encoding.GetEncoding("GB2312"));
               Response.Write(nv["Tag"]);

     

    要说我为啥知道上面几种解决方案,是因为我用 Reflector 看了 Request.QueryString 的实现代码。在查看代码时候,我们会看到这样一个 internal 方法:
    System.Web.HttpValueCollection 类的内部方法:
    internal void FillFromString(string s, bool urlencoded, Encoding encoding)

    这个内部方法实现了,按需解密查询参数的功能,但是遗憾的是,在QueryString 的处理函数中,强制指定了解析 QueryString 时,必须作一次 HttpUtility.UrlDecode。参看如下代码:

    public static NameValueCollection ParseQueryString(string query, Encoding encoding)
    {
        ...
        return new HttpValueCollection(query, false, true, encoding);
    }

    如果我们不想采用案例一的解决方案一,我们就需要自己写一个解析查询信息的代码。我们完全可以照抄 System.Web.HttpValueCollection 类的 internal void FillFromString(string s, bool urlencoded, Encoding encoding) 方法来改写。但郁闷的是:如果你用 Reflector 察看这个函数的实现时候,Reflector 出来的代码是错误的。正确的方法如下:是在施凡帮助下完成的。

    自己实现从 URL 查询文本 Query 中解析出我们自己需要的文本的方法

    /// <summary>
    /// 根据 URL 中的 查询文本 Query 解析成一个 NameValueCollection
    /// 在装配脑袋帮助下 郭红俊 改编自 System.Web.HttpValueCollection 类的内部方法:
    /// internal void FillFromString(string s, bool urlencoded, Encoding encoding)
    /// </summary>
    /// <param name="query">需要解析的查询文本</param>
    /// <param name="urlencoded">解析文本时候是否需要URL解码</param>
    /// <param name="encoding">解析文本时候,按照那种URL编码进行解码</param>
    /// <returns></returns>
    public static NameValueCollection FillFromString(string query, bool urlencoded, Encoding encoding)
    {
        NameValueCollection queryString = new NameValueCollection();
        if (string.IsNullOrEmpty(query))
        {
            return queryString;
        }

        // 确保 查询文本首字符不是 ?
        if (query.StartsWith("?"))
        {
            query = query.Substring(1, query.Length - 1);
        }

        int num1 = (query != null) ? query.Length : 0;
        // 遍历每个字符
        for (int num2 = 0; num2 < num1; num2++)
        {
            int num3 = num2;
            int num4 = -1;
            while (num2 < num1)
            {
                switch (query[num2])
                {
                    case '=':
                        if (num4 < 0)
                        {
                            num4 = num2;
                        }
                        break;
                    case '&':
                        goto BREAKWHILE;
                }
                num2++;
            }

        BREAKWHILE:

            string name = null;
            string val = null;
            if (num4 >= 0)
            {
                name = query.Substring(num3, num4 - num3);
                val = query.Substring(num4 + 1, (num2 - num4) - 1);
            }
            else
            {
                val = query.Substring(num3, num2 - num3);
            }
            if (urlencoded)
            {

                queryString.Add(HttpUtility.UrlDecode(name, encoding), HttpUtility.UrlDecode(val, encoding));
            }
            else
            {
                queryString.Add(name, val);
            }
            if ((num2 == (num1 - 1)) && (query[num2] == '&'))
            {
                queryString.Add(null, string.Empty);
            }
        }

        return queryString;

    }

    用上面的代码,我们就可以按需解析自己需要的查询参数,而不是受限的使用Request.QueryString 。

    小结

          Request.QueryString 替我们件事情:每次接受到参数后,都做 UrlEncode ,并且是按照 UTF-8编码做的 UrlEncode 。 这在大多数情况下没有任何问题,但是一些情况下,会给我们带来麻烦,本文就是分析这些可能给我们带来麻烦的场景,以及解决方法。

    参考资料:

    使用 Reflector ; 查看代码时候,碰到的一个Reflector 的bug
    http://blog.joycode.com/ghj/archive/2006/12/06/88646.aspx

    解密不同编码的的参数。
    http://blog.joycode.com/ghj/archive/2006/04/19/74894.aspx

    July 20

    YouTube and Live Spaces

     
    June 05

    Architecture Journal Profile: Don Ferguson

    For this issue, as part of the Architecture Journal Profile series, we had the chance to catch up with Don Ferguson, a Technical Fellow at Microsoft. We asked Don some questions about his career, and we asked what advice he had for people who wanted to become architects or who are interested in architecture today.

    AJ: Who are you, and where are you from?

    DF: I'm Don Ferguson. Before I joined Microsoft earlier this year, I was an IBM Fellow. There are about 200,000 engineers at IBM and about 50 Fellows, so it was quite an honor to be one of them. When I first joined IBM Research, I never thought that someday I would be a Fellow. Maybe one day, I would become a project leader; that would be quite an accomplishment. There are a lot of smart, talented people, and I just hoped that I could be one of them.

    AJ: How did it feel to become an IBM Fellow?

    DF: The day I became a Fellow was one of the best days of my life. In truth, I did feel a little bit awkward about the award, however. I felt that there were some people who deserved it more than I did. So, shortly after the announcement, I became an advocate for these people, and over the next few years was able to help get three or four of them to Fellow. In some ways, I was happier on their award days than on mine. When it happens to you, it's a blur; but when it happens to others, you have a lot of satisfaction.

    AJ: What did a typical day look like?

    DF: I was the Chief Architect in the Software Group in IBM. There were hundreds of products and projects. Being the Chief Architect means that you can't design every component. There are just too many projects and products for this to be a realistic goal. A large portion of my day would be spent doing a lot of review work. I would review several projects' or products' designs, focusing on some top-level things. I placed special emphasis on new products. Typically, I would focus on cross-product integration, common themes, and so on. For example, does the portal product have the right interface to connect to this security product? Is the product supporting the right standards? I used to jokingly refer to this as "herding the cats." On the title slide of presentations that I gave, I often used the title of "Chief Cat Herder."

    In the early days, this work was very unsatisfying—too abstract, too shallow, too broad. But then I had an epiphany: Working on pulling the different parts together a little bit more had a significant effect, especially across products. A little bit of improvement in a lot of places makes a difference. An example is also true of the work that I was able to do on the Web services standards. I think I helped make them a little more coherent, composable, easier to understand, and so on.

    AJ: With such responsibilities, how do you stay technically savvy?

    DF: Good question! The first thing I do is work really hard. When I'm not with the kids, it's often eat, sleep, work, karate; and sometimes sleep is optional. I definitely put in a lot of hours. Secondly, I do a lot of work on airplanes, where there are no conference calls or disruptions. Whenever possible, I consciously stay away from e-mail. I also try not to learn new technical information by reading a paper or presentation. The best way is to download, install, use, and code.

    Over the years, one of the things I've learned to do well is to synthesize how things should work with only a little bit of information. By and large, people are smart. With a little bit of information, I can often figure out what smart people must have done. How would smart people have designed this? With this process, although I may not know the topic in-depth, I can often work out how things must work and contribute to the discussion.

    In IBM, I tended to have around 10 to 12 initiatives that I was working on at any time. I would spend a few months on each project, multiplexing between the initiatives. Eventually, each initiative would either take on a life of its own or not pan out. You'll see a lot of this in the standards work I participated in. I was listed as contributor for many of the early papers, but over time I disappeared. A lot of good people started driving and doing deep technical work, and I moved on to something else.

    AJ: What advice would you give someone who wants to become an architect today?

    DF: I think there are four pieces to this answer:

    Firstly, at IBM we had an architect board in the Software Group, which helped me form a network. It took me a while to understand the importance of a network. Being a New Englander, I tend to be a little taciturn and by myself. You should never underestimate the importance of a social network. You don't know what you don't know. You don't know what someone may say to you that can push the reset button in your brain and make you think differently.

    Secondly, as a software architect, never stop coding. I write code. It's not good or particularly deep code, but I do code. A lot of it is educational and related to my spare-time activities. For example, recently, I've been working on a portal that connects my family using TikiWiki and PHP. I installed the products, but they didn't work for me right out of the box. So, I had to go in and hack them. It was cool. Another example is the nursery school that my daughter attends. They asked me to set up a Web site using [Microsoft] FrontPage, which was another learning experience.

    Thirdly, communication skills matter. They really do. It's really important to understand how to write well and how to present well.

    Finally, the most important thing is to connect with customers. Spend as much time as possible with them. Learn what they are trying to do, and look at what works and what doesn't. Help them use your products. There's no substitute for spending time with customers and helping them solve problems. Doing this, we often learned that customers used things in ways that we never dreamed they would. We also came up with amazing new ideas.

    AJ: Who is the most important person you've ever met, and what made that person so significant?

    DF: When I started out in academia and the Research Division, my thesis adviser (Yechiam Yemini) was really important. He taught me two things:

    People who are driven tend to underestimate the quality of what we do. We are too hard on ourselves. We think our papers aren't very good or our research isn't novel. My adviser helped with perspective.

    Secondly, he taught me that this stuff can be fun. Just have a good time, and enjoy what you are doing. He had a very contagious, childlike enthusiasm.

    In addition to my adviser, there are many more people at IBM who became great friends and role models. Tony Storey was the most important one. I would look at the ones that I respected, and often try to "reverse-engineer" how they do their job. I would consciously try to be like them.

    AJ: What is the one thing in your career that you regret? What did you learn from it?

    DF: Wow! I don't even know where to begin! I'll give you two: My old group gave me a "Darth Vader" helmet, because of the way I was operating in the early days. "Do it my way or I will blow your planet up." The "Darth Vader" approach doesn't work. You can't make smart people do things that they don't want to do. People do well what they want to do. For me, that was an epiphany. Why was I so curt and domineering? I was busy, and all I could think about was, "I have these 20 things to do. Why won't this person just do what I want?" I came to realize that this approach never works, no matter how hard you try. People deserved my time, and I owed them the time.

    Secondly, many people who work in technology suffer from the "endgame fallacy." We are all pretty bright. We see a lot of customers. We see what they are doing and then plot a trajectory for where they will be in a few years. Once you do this, however, it's too tempting to build what they will need in five years, and not what they need next or are ready for. Sometimes, I say there is no point in building the Emerald City without building the Yellow Brick Road; and you have to build the road first. Often, I would make things too complicated, anticipating their future needs. One of the senior executives used to say that "vision without execution is hallucination," and it's true.

    AJ: What does Don's future look like?

    DF: To answer this, I have another piece of advice. When I ask myself that question, I always put personal fulfillment first and then job fulfillment second. If you are not fulfilled personally, you will never be fulfilled in your job. I have a black belt in karate (Kenpo) and want to get better at that. I want to take another discipline: Jiu-Jitsu. I would like to teach Kenpo. Personal fulfillment has to come first.

    For job fulfillment and what excites me, I imagine a point in the future where everyone can program. This isn't so much about using Fortran and C#, but instead another definition of "program." It sounds strange, but let me explain:

    Everyone who graduates from high school has done some programming—even if it's something simple like a PHP Web site. These are basic skills now—just like I learned how to do long division by hand (although I would argue that students of today can't do long division anymore). These casual programmers will enter the workforce.

    Maybe we need to broaden our definition of "program." What's the number one "programming tool" for business professionals? [Microsoft Office] PowerPoint. If business professionals can use [Office] PowerPoint, I wonder whether we can nudge them into another tool to do business modeling. They already do business modeling, but they do it by using documents that get handed to programmers. Programmers guess what the documents mean, and bad things happen when programmers guess. I wonder whether we can do something cleverer. In business schools, they teach a discipline called structured English and various diagramming techniques. Maybe these could form the basis for programming business services.

    Job fulfillment for me would be thinking about how we change the fundamental nature of the Web. Web 2.0, mash-ups, and feeds are interesting, but they are step one of a two-step process. The Web today is a push model.

    People write content that is pushed out to people who read it. Programmers write Web applications that end users "use." People write mash-ups or scripts to access the "pushed" content. These applications run on the PC today, but I believe that they could migrate into the Internet "cloud." The Internet now becomes the programmable Internet and can run my applications for me. The tag line is, "The Internet is the computer." We see this in nascent places already—with Google, Amazon.com, MSN, and so on all now having callable services. Together with a broad range of programming skills for everyone, I see a blurring between the personal and business environment. That's what I really care about.

     

    More on Donald Ferguson's Career

    Dr. Donald Ferguson is a Microsoft Technical Fellow in Platforms and Strategy in the Office of the CTO. Don focuses on both the evolutionary and revolutionary roles of information technology in business. Microsoft expects that he will be involved in a variety of forward-looking projects. Prior to Joining Microsoft, Don was an IBM Fellow and Chief Architect for IBM's Software Group (SWG). Don provided overall technical leadership for WebSphere, Tivoli, DB2, Rational, and Lotus products. He also chaired the SWG Architecture Board (SWG AB). The SWG AB focused on product integration, cross-product initiatives, and emerging technology. Some of the public focus areas were Web services, patterns, Web 2.0, and business-driven development. Don guided IBM's strategy and architecture for SOA and Web services, and coauthored many of the initial Web service specifications.

    This article was published in the Architecture Journal, a print and online publication produced by Microsoft. For more articles from this publication, please visit the Architecture Journal Web site.

     
    March 22

    谈论 身份标识: 使用 Windows CardSpace 保证您的 ASP.NET 应用程序和 WCF 服务的安全

     

    引用

    Windows CardSpace 采用更加一致和简化的登录过程取代了传统的身份验证,并改善了最终用户、应用程序和服务之间的信任。

    Link

    March 21

    Talking about 服务站: WCF 消息传递基础

     

    Quote

    服务站: WCF 消息传递基础
    本月 Aaron Skonnard 将着重介绍 Windows Communication Foundation 中复杂的基于 XML 的消息传递框架背后的一些主要消息传递功能。
    March 09

    谈论 WCF Essentials: What You Need To Know About One-Way Calls, Callbacks, And Events

     

    引用

    Object and component-oriented programming have only one way for clients to call a method, but Windows

    Talking about 并发事件: 实现 CLR 异步编程模型

     

    Quote

    并发事件: 实现 CLR 异步编程模型
    Jeffrey Richter 讲解如何定义一个类来实现 CLR 的异步编程模型,以使 I/O 操作效率更高。
    October 18

    广告...感兴趣的联系我

    首先感谢您一直以来对Windows Live Expo的关注与兴趣!现在,我们诚邀您试用Windows Live Expo China Beta版(http://cn.expo.live.com)! “Beta”就是还没有最终完成的意思,这个阶段主要进行测试,为产品向公众发布作准备。

    立刻点击下面的Join Now 链接,赶快加入我们(当然,你必须首先有一个.Net Passport账户)。如果您想更详细的了解Expo,请仔细阅读以下信息。


    立即加入
    Expo是什么?
    Expo是Microsoft为满足日益发展的社交网络市场需求而推出的一款全新产品。通过将社交网络整合到分类广告的概念中,Windows Live Expo将传统的分类广告服务提升到一个新的水平。

    Expo不仅仅限于出售产品。它是一个动态的社会信息服务系统。用户可在这里买卖商品,获得信息,寻求合作。而这一切服务都是完全免费的。

    体验Expo的特色服务:

    • 与信任的人建立联系、实现交换——你可以选择熟悉的人,例如和Messenger上的朋友以及你的同事交易物品
    • 您可以定位查找附近或者某个特定范围内的信息
    • 便捷、及时、免费的交易
    通过整合Microsoft的Messenger, Spaces等各项产品,Expo让用户使用更加方便,也提供更多的广告发布机会。

    Expo在美国已经对公众正式发布了。现在Expo项目组需要您测试我们在中国的服务。在Expo中国站点正式向公众发布之前,我们需要您,作为Beta版的测试者,在Expo上发布分类信息,并给予我们使用反馈。

    目前,Expo China仅仅是Beta版本,这意味着只有收到邀请的人才能成为我们的用户。而您正是我们诚挚邀请的对象。您对Expo China Beta版的使用将会帮助我们改进和完善Expo。


    您要做些什么?
    1.使用、使用、再使用
    我们需要获得大量测试数据,所以希望您在站点上发布信息,最好是真实的信息。但是如果您没有太多需要交易的物品,只是专门为了帮助我们测试,那么请到站点的“同城寻缘”下的“测试专栏”目录发布信息。您也可以尝试搜索、查询别人发布的信息。


    2.提交反馈
    使用过程中,您可能会发现问题、漏洞或者产生建议,那正是我们发布Beta版的目的所在,请您通过填写反馈表,将自己的使用体验、想法以及发现的问题发送给我们。

    您只要点击Expo China站点页脚上的“反馈”链接,就可以看到我们的反馈表。


    3.担当Expo的传播使者
    我们期待您的家人和朋友也可以来试用Expo。你已经获得了一定的名额,可以邀请他们来参与使用。您只需要点击Expo上左边导航条上的“邀请朋友”链接即可。

    我们也期待您能邀请更多的人参与这项测试,让更多的人知道Expo。一旦您用完了名额,你完全可以申请更多的数量。只需登录http://ideas.live.com后点击“申请新名额”即可。

    亲爱的朋友,
    也许你正想处理掉那些旧的DVD、汽车、家具以及不喜欢的演奏会门票;
    也许你正准备把刚出生的小猫仔赠送给朋友和同事;
    也许你正要买一辆特别而又实惠的单车;
    也许你正为你的乐队寻一个新的鼓手;
    那么,来吧,强大的Expo等着你!

    马上行动起来,点击上面的“立即加入”按钮,开始你的Expo之旅。


    最后,再次感谢您试用这项全新的服务,您的反馈将极大帮助我们改进我们的产品!
    Windows Live Expo项目组

    August 02

    Try it.

    Live Space Coming!!!