`
wyf
  • 浏览: 436849 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

在HTTP协议下使用JSON在flash和C# web程序之间通讯

阅读更多

先把文章中要用到一些扩展程序集贴出来。

C#用到了System.Web.Extensions程序集,包括3个文件:
System.Web.Extensions.dll
System.Web.Extensions.Design.dll
AJAXExtensionsToolbox.dll

Flash用到了adobe的corelib-.90程序集:
corelib.swc

网上现在有很多将flash与C# web 服务程序通讯的资料,不过很多都是用remoting或者web service的方式做的,而且很多高手还做了效率比较,结果是基于TCP协议的remoting效率最好,但是这里对remoting就不多说了,并且基于TCP的remoting因为协议不同效率差别肯定明显。我还是介绍在HTTP协议下的通讯方法吧。

这里使用iis作为服务器,服务程序只要能处理客户端提交的数据,能向客户端返回数据就行(当然push做不到,http协议嘛)。所以处理程序大多直接实现IHttpHandle接口,当然从Page继承是一点也没有问题的,因为Page类也实现了IHttpHandle接口,如何继承Page,如何实现IHttpHandle的接口方法就给个例子吧,这个资料挺多的。

using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.SessionState;

namespace com.Flight.Script
{
    /// <summary>
    /// 脚本控制请求,IRequiresSessionState接口没有啥方法,纯粹为了session支持
    /// </summary>
    public class ScriptHandler : IHttpHandler, IRequiresSessionState
    {
        /// <summary>
        /// 处理脚本请求
        /// </summary>
        /// <param name="context">脚本名称</param>
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            context.Response.Write("输出内容");
        }

        /// <summary>
        /// 是否允许后续请求处理
        /// </summary>
        public bool IsReusable
        {
            get
            {
                return true;
            }
        }
    }
}

这里提一下web.config配置,下面是一个例子,在这里例子里面我修改了扩展名“.do”,这样的配置要求修改iis服务器设置的,如果没有自己的服务器最好别这样做,比较麻烦,可以使用“ashx”或者“axd”都可以。

<httpHandlers>
  <add verb="*" path="chat.do" type="com.gs.chat.Chat, Game"/>
</httpHandlers>

下面是服务器上将对象进行JSON序列化的程序,其实JSON序列化就是将一个对象转换成有规律的字符串,能够被别人解读出来,但不是所有的对象都能被序列化,一定要实现了ISerializable接口的类才行,可以参考Hashtable类,这个类就实现了ISerializable接口中的GetObjectData方法,因此这个类型的对象进行反序列化是没有问题的。

using ...
using System.Web.Script.Serialization;
using ...

...
/// <summary>
/// 向客户端返回的数据
/// 默认采用json编码格式
/// </summary>
/// <param name="_result">服务器方法的方会对象</param>
/// <returns>返回字符串</returns>
public virtual string JsonResult(object _result)
{
    //返回的字符串
    string resultString = "";
    //采用了微软的序列化方式
    JavaScriptSerializer jss = new JavaScriptSerializer();
    resultString = jss.Serialize(_result);
    return resultString;
}

/// <summary>
/// 反序列化,从JSON字符串转换到对象
/// </summary>
/// <param name="_jsonstring">JSON串</param>
/// <returns>反序列化得到的对象</returns>
public virtual object JsonObject(string _jsonstring)
{
    JavaScriptSerializer jss = new JavaScriptSerializer();
    return jss.DeserializeObject(_jsonstring);
}
...

输出都是一样的,直接Write:

context.Response.Write(_text);

这里对于服务器的开发方法可以很多,比如在同一个IHttpHandle中可以写多个处理程序,分别处理不同的请求,然后有个专门的类负责分析要执行哪个方法。下面是发送和接收聊天消息的方法,供参考:

using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using com.Flight.Web.Ajax;
using System.Text.RegularExpressions;

namespace com.gs.chat
{
    public class Chat : AjaxController
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            AjaxJsBuilder.RegistType(typeof(Chat));
            StartProcess();
        }

        [SafeMethod("A")]
        [AjaxMethod()]
        public Hashtable SendMessage(string _msg)
        {
            string patternForCmd = @"-\|cmd:[a-zA-z]+\|-";
            Regex rg = new Regex(patternForCmd, RegexOptions.IgnoreCase | RegexOptions.Singleline);
            Match m = rg.Match(_msg);

            if (m.Success)
            {
                string cmd = m.Value;
                if (cmd.ToLower().Equals("-|cmd:clear|-"))
                {
                    MessageContainer.MsgContainer.Clear();
                }
            }
            else
            {
                Message msg = new Message("me", "all", _msg, ToType.ALL);
                MessageContainer.MsgContainer.Add(msg);
            }
            Hashtable rht = new Hashtable();
            rht.Add("stat", "OK");
            rht.Add("msg", "发送成功。");
            return rht;
        }

        [SafeMethod("A")]
        [AjaxMethod()]
        public MessageContainer ReceiveMessage(string _u)
        {
            MessageContainer mc = new MessageContainer();
            foreach (Message msg in MessageContainer.MsgContainer)
            {
                if (msg.From.Equals(_u) || msg.To.Equals(_u))
                {
                    mc.Add(msg);
                }
            }

            return mc;
        }
    }
}

AjaxController这个类是自己写的,从page继承,用来做一些基本处理,比如JSON序列化啊,反序列化啊,安全检查啊,还有分析客户端要调用的方法之类,后面也会提到一些里面的具体设计。

下面看看客户端的开发,首先是向服务器发送请求,这个比较简单,直接贴一个简单例子,应该都明白

import flash.net.URLLoader;
import flash.net.URLRequest;

var request:URLRequest = new URLRequest(url);
var loader:URLLoader = new URLLoader();
var request_data:String = ajax_flag + "&" + method_flag + method + "&" + parameters;
request.data = request_data;
request.method = URLRequestMethod.POST;
loader.load(request);

主要是在loader的complete事件中处理的时候要注意把服务器返回的字符串进行JSON反序列化,转换成对象,代码如下:

import com.adobe.serialization.json.JSON; //导入使用的到类

在load_complete事件里面写如下代码:

//从事件对象想读取服务器返回的数据,反序列化为对象
var receiveMsg:Object = JSON.decode(event.target.data);

获取receiveMsg对象之后就可以通过点操作符访问属性数据了。以一个HashTable为例,其中的Key就是反序列化后对象的属性,Value就是属性值。

在C#中能够被直接序列化的容器对象很多,可以更具需要选择,如果都不能满足你的要求,也可以自己写一个对象,实现ISerializable接口的GetObjectData方法进行数据传输。

按照上面的实现思路,如果一个IHttpHandle只能处理一种请求那么我们就要写出很多很多的IHttpHandle这样就无法和webservice相提并论了,因为我们知道在webservice中一个service可以提供多个方法响应客户端的请求,这个其实只要我们稍作处理就可以了,比如上面的例子里面我们看到请求字符串中包含了一些特殊的参数:

ajax_flag + "&" + method_flag + method

可以很容易看出来,这里就是用来告诉服务器我要调用哪些方法的参数。

注意:服务器方法在响应请求之前还要做安全判断,这个判断很重要,否则随便就能调用服务器程序那岂不太危险?这里给出一个简单的解决方法,可以采用一个HttpModule做前端判断,如果已经登录,请求参数中没有特殊的符号(防止注入),并且有访问这个HttpHandle的权限那么继续,然后在HttpHandle中给指定的方法加个安全特性代码如下:

[SafeMethod("A")]
[AjaxMethod()]
public MessageContainer ReceiveMessage(string _u)
{
    MessageContainer mc = new MessageContainer();
    foreach (Message msg in MessageContainer.MsgContainer)
    {
        if (msg.From.Equals(_u) || msg.To.Equals(_u))
        {
            mc.Add(msg);
        }
    }

    return mc;
}

[AjaxMethod()]和[SafeMethod("A")]这两个特性说明ReceiveMessage方法是允许客户端调用的,并且用户具有特性A的时候才能执行这个方法,否则报错。

原文链接:http://bbs.actionscript3.cn/thread-23446-1-1.html
分享到:
评论

相关推荐

    Flash 与 html及C#程序通讯

    当Flash需要与C#程序通信时,通常是通过Web服务(如SOAP或RESTful API)或WebSocket来实现。C#可以创建Web服务,Flash则作为客户端通过HTTP请求与之通信。另外,WebSocket提供双向实时通信,使得Flash和C#之间能建立...

    flash 与 C# 通信

    在IT领域,跨平台通信是常见的需求,尤其是在Web开发中,Flash和C#之间的交互尤为重要。Flash作为一种曾经广泛用于创建动态网页内容的技术,其与后端语言如C#的通信能力,为丰富的用户界面和多媒体应用提供了可能性...

    FlashSocket与C#通讯

    "FlashSocket与C#通讯"是一个关键的主题,涉及到客户端与服务器之间的低延迟、双向通信。以下是关于这个主题的详细解释: FlashSocket,全称Adobe Flash Socket,是Adobe Flash Player支持的一种高级网络功能,它...

    Flash与C#交互

    本主题将深入探讨如何在BS(Browser-Server,浏览器-服务器)和CS(Client-Server,客户端-服务器)架构下实现Flash与C#之间的通信。 Flash是一款由Adobe公司开发的多媒体创作平台,它允许开发者创建动态的、交互式...

    Flash与C#交互全集(bs与cs).rar

    在IT领域,尤其是在Web开发中,Flash与C#的交互是一项重要的技术,它允许富互联网应用程序(RIA)和服务器端程序之间进行数据交换,提升用户体验。本资源"Flash与C#交互全集(bs与cs)"提供了全面的指导,涵盖了B/S...

    C#与Flash交互

    在C#和Flash之间建立通信,通常采用以下几种方法: 1. **Socket通信**:C#可以通过System.Net.Sockets命名空间中的Socket类创建服务器端,Flash使用AS3的Socket类作为客户端,两者通过TCP/IP协议进行双向数据传输。...

    C# Socket单端口多种通讯协议服务

    标题中的“C# Socket单端口多种通讯协议服务”是指使用C#的Socket类库来构建一个服务器,该服务器可以在单一端口上同时支持多种不同的通讯协议,如HTTP、WebSocket、Flex策略和Fast中间件。这是一项高级技术,因为它...

    OpenFlashChart C#flash图形控件使用 demo

    这个资源包“OpenFlashChart C# flash图形控件使用 demo”包含了作者三年来在系统软件项目实施过程中积累的实践经验,为C#开发者提供了一个很好的学习和参考平台。 OpenFlashChart的主要优点在于它的灵活性和可定制...

    C#.net 实现flash输出数据内容至页面

    为了让两者通信,我们需要使用ActionScript(Flash的编程语言)和C#.NET之间的接口,这个接口通常通过HTTP服务或者Flash的LocalConnection对象来建立。 1. **使用Flash ExternalInterface API**: Flash Player...

    C# Web端多文件上传

    本项目通过Visual Studio(VS)提供的工具和技术实现这一功能,主要涉及的知识点包括C#编程语言、ASP.NET Web应用程序框架以及前端交互技术。 1. **ASP.NET Web Forms或MVC**: C# Web开发通常基于ASP.NET平台,...

    c# flash 饼图 柱状图 线型图

    在IT行业中,数据可视化是至关重要的,它能够帮助我们更好地理解和解释复杂的数据。...开发者需要掌握C#的数据处理、Flash的ActionScript编程以及两者之间的通信技术,才能充分发挥这一组合的优势。

    Flash做的WebQQ全套源码-C#服务端

    通过深入研究这套源码,学习者可以了解到Web应用的基本架构,理解客户端-服务器通信的流程,掌握Flash和C#的结合使用,同时对WebQQ的工作机制有更深入的理解。对于想要从事Web开发,特别是富互联网应用(RIA)开发的...

    c#+flash+js实现多文件无刷新上传带进度条

    "c#+flash+js实现多文件无刷新上传带进度条"是一个技术方案,它结合了C#、Flash(AS3)和JavaScript三种技术来提供高效且用户体验良好的文件上传功能。这个方案的关键在于实现了多文件选择、无刷新页面更新以及上传...

    flash雷达源程序,利用它可以作为控件

    【标题】:“Flash雷达源程序”是一个基于Adobe Flash CS3开发的交互式应用程序,它被设计为一个可嵌入的控件,可以集成到其他Web页面或项目中,用于显示实时或模拟的雷达数据。这样的程序在教育、游戏、气象预报、...

    json所有需要的包,免费下载

    JSON(JavaScript Object Notation)是一种...综上所述,这个"json_lib"压缩包可能是为了满足不同编程语言和框架下处理JSON数据的需求,提供了一系列的库或工具,使得开发者能够更加便捷地在各自的开发环境中使用JSON。

    在Flex中的Json应用

    Flex中的JSON应用主要涉及到使用ActionScript 3(AS3)处理JSON数据,这是一种轻量级的数据交换格式,常用于Web服务与客户端之间的通信。在Flex开发中,由于Flex是基于AS3的,所以理解如何在Flex中使用JSON至关重要...

    C# falsh切换图片

    在C#编程中,结合JavaScript实现Flash动态切换图片是一种常见的技术,主要应用于Web应用程序中,为用户提供丰富的交互体验。下面将详细讲解如何利用C#和JavaScript实现这一功能,并涉及相关知识点。 1. C#后端处理...

    c# swfupload mvc

    首先,C#(读作"C sharp")是一种由微软开发的面向对象的编程语言,它被广泛用于Windows和Web应用程序的开发,特别是在.NET Framework或.NET Core平台上。C#支持多种现代编程特性,如泛型、lambda表达式、异步编程等...

    Communicating between Flex and .NET

    6. **JSON(JavaScript Object Notation)**:另一种轻量级的数据交换格式,虽然不是Flex原生支持的,但通过库如AS3CoreLib,可以在Flex中解析和生成JSON数据,与C#服务进行通信。 7. **安全性**:跨域策略文件...

    FLASH无限分类相册.zip

    1. **Flash技术**:Adobe Flash是一款用于创建动画、图形、交互式内容和应用程序的软件,尤其在Web上广泛使用。它可以创建丰富的用户界面,实现动态效果和多媒体集成。在本项目中,Flash可能用于设计相册的用户界面...

Global site tag (gtag.js) - Google Analytics