[教程]WebClient研究

mikel阅读(1031)

WebClient
    Mircsoft在dotnet1.1框架下提供的向 URI 标识的资源发送数据和从 URI 标识的资源接收数据的公共方法。
通过这个类,大家可以在脱离浏览器的基础上模拟浏览器对互联网上的资源的访问和发送信息。
    WebClient类不能被继承,在dotnet1.1框架中已经为我们提供了WebRequest和WebResponse两个强大的类来
处理向URI标示的资源和获取数据了。然后,不足的是利用WebRequest和WebResponse时设置过于复杂。
使用起来颇为费劲。于是乎有了现在的WebClient,WebClient其实可以理解为对WebRequest和WebResponse等
协作的封装。它使人们使用起来更加简单方便,然后它也有先天不足的地方。那就是缺少对cookies/session的
支持,用户无法对是否自动url转向的控制,还有就是缺少对代理服务器的支持。关于session/url转向控制/代理
服务器的使用我将在以后关于WebRequest/WebResponse的话题里面向大家介绍。下面先给大家简单介绍一
下WebClinet类。
  类名:WebClient
  命名空间System.Net.WebClient
 

公共构造函数

WebClient 构造函数 初始化 WebClient 类的新实例。

公共属性

BaseAddress 获取或设置 WebClient 发出请求的基 URI。
Container(从 Component 继承) 获取 IContainer,它包含 Component
Credentials 获取或设置用于对向 Internet 资源的请求进行身份验证的网络凭据。
Headers 获取或设置与请求关联的标头名称/值对集合。
QueryString 获取或设置与请求关联的查询名称/值对集合。
ResponseHeaders 获取与响应关联的标头名称/值对集合。
Site(从 Component 继承) 获取或设置 ComponentISite

公共方法

CreateObjRef(从 MarshalByRefObject 继承) 创建一个对象,该对象包含生成用于与远程对象进行通讯的代理所需的全部相关信息。
Dispose(从 Component 继承) 已重载。释放由 Component 占用的资源。
DownloadData 从具有指定 URI 的资源下载数据。
DownloadFile 从具有指定 URI 的资源将数据下载到本地文件。
Equals(从 Object 继承) 已重载。确定两个 Object 实例是否相等。
GetHashCode(从 Object 继承) 用作特定类型的哈希函数,适合在哈希算法和数据结构(如哈希表)中使用。
GetLifetimeService(从 MarshalByRefObject 继承) 检索控制此实例的生存期策略的当前生存期服务对象。
GetType(从 Object 继承) 获取当前实例的 Type
InitializeLifetimeService(从 MarshalByRefObject 继承) 获取控制此实例的生存期策略的生存期服务对象。
OpenRead 为从具有指定 URI 的资源下载的数据打开一个可读的流。
OpenWrite 已重载。打开一个流以将数据写入具有指定 URI 的资源。
ToString(从 Object 继承) 返回表示当前 ObjectString
UploadData 已重载。将数据缓冲区上载到具有指定 URI 的资源。
UploadFile 已重载。将本地文件上载到具有指定 URI 的资源。
UploadValues 已重载。将名称/值集合上载到具有指定 URI 的资源。

从上表中我们可以看到WebClient提供四种将数据上载到资源的方法:

  • OpenWrite 返回一个用于将数据发送到资源的 Stream
  • UploadData 将字节数组发送到资源并返回包含任何响应的字节数组。
  • UploadFile 将本地文件发送到资源并返回包含任何响应的字节数组。
  • UploadValuesNameValueCollection 发送到资源并返回包含任何响应的字节数组。

另外WebClient还提供三种从资源下载数据的方法:

  下面我们将通过一个简单的应用程序来测试WebClient的最简单用法作为本小节的结束让大家对WebClient有个初步的认识
  
   例子1:利用WebClient实现对博客园首页的访问
  
    首先我们用HttpLook对这次访问进行分析,为了方便分析我特别将浏览器对图片的访问去掉 让我们能看到更简便的分析结果
   
     我们可以看到整个过程中我们发起了4次资源请求,其中第一次是对博客园首页进行访问
     第二次访问的是样式表文件,第三和四次访问的是js脚本。
     我们点击第一项可以看见关于这次资源访问的http头部信息,所谓http头部就是我们不能看见的浏览器和远程服务器传递的一些不可见元素。

1GET / HTTP/1.1
2Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
3Accept-Language: zh-cn
4UA-CPU: x86
5Accept-Encoding: gzip, deflate
6User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)
7Host: www.cnblogs.com
8Connection: Keep-Alive
9Cookie: .DottextCookie=(隐藏)

  这些http信息包含了浏览器访问的过程。其中
  第一行:请求地址的相对路径和使用协议 相对路径为/ 协议采用http1.1
  第二行:表示我们请求的资源种类。
  第三行:我们的语言是简体中文。
  第四行:我们使用的cup结构。这个http头在一般的网页中并不过见。估计是博客园的一次调查??
  第五行:标示采用gzip方式压缩html编码进行传递。只有一些浏览器支持的gzip解压缩时采用这种方式传递文本。由于我们
  要写的程序不具备gzi解压缩的能力 所以我们不考虑使用这种方式发送请求。
  第六行:浏览器说明
  第七行:当前主机地址
  第八行:连接请求状态
  第九行:cookies信息
 
  我在新建的应用程序里面利用WebClient来实现这了一过程。
  
  下面我将就关键实现做一些解释

 1WebClient _client=new WebClient();
 2            _client.BaseAddress="http://www.cnblogs.com";
 3            _client.Headers.Add("Accept","image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*");
 4            _client.Headers.Add("Accept-Language","zh-cn");
 5            _client.Headers.Add("UA-CPU","x86");
 6            //_client.Headers.Add("Accept-Encoding","gzip, deflate");
 7            _client.Headers.Add("User-Agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)");
 8            System.IO.Stream objStream=_client.OpenRead("/");
 9            System.IO.StreamReader _read=new System.IO.StreamReader(objStream,System.Text.Encoding.UTF8);
10            textBox1.Text=_read.ReadToEnd();

  第一行:新建一个WebClient 实例_client
  第二行~第七行:将上边捕捉到的Http头部放入到_client实例,注意第六行的被注释掉了。因为我们的程序无法进行gzip解码所以如果这样请求
  获得的资源可能无法解码。当然我们可以给程序加入gzip处理的模块 那是题外话了。
  第八行:利用_client.OpenRead(string URI)的方法获取网上资源的Stream
  第九行:利用StreamReader将Stream用我们需要的编码方法去解析。这里使用了UTF8。对应不同的网站可以使用Default等不同的解码方法。
  第十行:将我们解码后的内容放到textBox1里面显示出来
  好了 大致关于WebClient的介绍就到这里了。以后将为大家陆续介绍WebClient的各种属性和方法。
  利用WebClient做个资源小偷其实是很简单的,所以大家一定要防盗链阿!!!

[教程]使用Forms Authentication实现用户注册、登录 (一)基础知识

mikel阅读(723)

本文示例代码:http://www.codeplex.com/a/Release/ProjectReleases.aspx?ReleaseId=9518

前言

  本来使用Forms Authentication进行用户验证的方式是最常见的,但系统地阐明其方法的文章并不多见,网上更多的文章都是介绍其中某一部分的使用方法或实现原理,而更多的朋友则发文询问如何从头到尾完整第实现用户的注册、登录。因此,Anders Liu在这一系列文章中计划通过一个实际的例子,介绍如何基于Forms Authentication实现:

l  用户注册(包括密码的加密存储)

l  用户登录(包括密码的验证、设置安全Cookie

l  用户实体替换(使用自己的类型作为HttpContext.User的类型)

  有关Forms Authentication的原理等内容不属于本文的讨论范畴,大家可以通过在Google等搜索引擎中输入“Forms Authentication”、“Forms身份验证”、“窗体身份验证”等关键词来查看更多资源。本文仅从实用的角度介绍如何使用这一技术。

 

不使用Membership

  本文介绍的实现方式不依赖ASP.NET 2.0提供的Membership功能。这主要是因为,如果使用Membership,就必须用aspnet_regSQL.exe实用工具配置数据库,否则就得自己写自定义的MembershipProvider

  如果用aspnet_regSQL.exe配置数据库,就会导致数据库中出现很多我们实际并不需要的表或字段。此外更重要的是,默认的SQLMembershipProvider给很多数据表添加了ApplicationID列,其初衷可能是希望可以将多个应用程序的用户全部放在一个库里,但又能彼此隔离。但实际情况是,每个应用程序都在其自身的数据库中保存用户数据。因此,引入这个ApplicationID无端地在每次查找用户时增加了额外的条件。

  另一方面,如果考虑自己实现一个MembershipProvider,因为工作量巨大,有点得不偿失。

  但是,如果不使用Membership,也就无法享受ASP.NET 2.0中新增的Login等控件的便利了。

 

Forms Authentication相关的配置

  在web.config文件中,<system.web>/<authentication>配置节用于对验证进行配置。为<authentication>节点提供mode="Forms"属性可以启用Forms Authentication。一个典型的<authentication>配置节如下所示:

 

<authentication mode="Forms">

     <forms

         name=".ASPXAUTH"

         loginUrl="login.aspx"

         defaultUrl="default.aspx"

         protection="All"

         timeout="30"

         path="/"

         requireSSL="false"

         slidingExpiration="false"

         enableCrossAppRedirects="false"

         cookieless="UseDeviceProfile"

         domain=""

     />

</authentication>

 

  以上代码使用的均是默认设置,换言之,如果你的哪项配置属性与上述代码一致,则可以省略该属性例如<forms name="MyAppAuth" />。下面依次介绍一下各种属性:

l  name——Cookie的名字。Forms Authentication可能会在验证后将用户凭证放在Cookie中,name属性决定了该Cookie的名字。通过FormsAuthentication.FormsCookieName属性可以得到该配置值(稍后介绍FromsAuthentication类)。

l  loginUrl——登录页的URL。通过FormsAuthentication.LoginUrl属性可以得到该配置值。当调用FormsAuthentication.RedirectToLoginPage()方法时,客户端请求将被重定向到该属性所指定的页面。loginUrl的默认值为“login.aspx”,这表明即便不提供该属性值,ASP.NET也会尝试到站点根目录下寻找名为login.aspx的页面。

l  defaultUrl——默认页的URL。通过FormsAuthentication.DefaultUrl属性得到该配置值。

l  protection——Cookie的保护模式,可取值包括All(同时进行加密和数据验证)、Encryption(仅加密)、Validation(仅进行数据验证)和None。为了安全,该属性通常从不设置为None

l  timeout——Cookie的过期时间。

l  path——Cookie的路径。可以通过FormsAuthentication.FormsCookiePath属性得到该配置值。

l  requireSSL——在进行Forms Authentication时,与服务器交互是否要求使用SSL。可以通过FormsAuthentication.RequireSSL属性得到该配置值。

l  slidingExpiration——是否启用“弹性过期时间”,如果该属性设置为false,从首次验证之后过timeout时间后Cookie即过期;如果该属性为true,则从上次请求该开始过timeout时间才过期,这意味着,在首次验证后,如果保证每timeout时间内至少发送一个请求,则Cookie将永远不会过期。通过FormsAuthentication.SlidingExpiration属性可以得到该配置值。

l  enableCrossAppRedirects——是否可以将以进行了身份验证的用户重定向到其他应用程序中。通过FormsAuthentication.EnableCrossAppRedirects属性可以得到该配置值。为了安全考虑,通常总是将该属性设置为false

l  cookieless——定义是否使用Cookie以及Cookie的行为。Forms Authentication可以采用两种方式在会话中保存用户凭据信息,一种是使用Cookie,即将用户凭据记录到Cookie中,每次发送请求时浏览器都会将该Cookie提供给服务器。另一种方式是使用URI,即将用户凭据当作URL中额外的查询字符串传递给服务器。该属性有四种取值——UseCookies(无论何时都使用Cookie)、UseUri(从不使用Cookie,仅使用URI)、AutoDetect(检测设备和浏览器,只有当设备支持Cookie并且在浏览器中启用了Cookie时才使用Cookie)和UseDeviceProfile(只检测设备,只要设备支持Cookie不管浏览器是否支持,都是用Cookie)。通过FormsAuthentication.CookieMode属性可以得到该配置值。通过FormsAuthentication.CookiesSupported属性可以得到对于当前请求是否使用Cookie传递用户凭证。

l  domain——Cookie的域。通过FormsAuthentication.CookieDomain属性可以得到该配置值。

  以上针对<system.web>/<authentication>/<forms>节点的介绍非常简略,基本上是Anders Liu个人对于文档进行的额外说明。有关<forms>节点的更多说明,请参见MSDN文档(http://msdn2.microsoft.com/zh-cn/library/1d3t3c61(VS.85).aspx)。

 

FormsAuthentication

  FormsAuthentication类用于辅助我们完成窗体验证,并进一步完成用户登录等功能。该类位于system.web.dll程序集的System.Web.Security命名空间中。通常在Web站点项目中可以直接使用这个类,如果是在类库项目中使用这个类,请确保引用了system.web.dll

  前一节已经介绍了FormsAuthentication类的所有属性。这一节将介绍该类少数几个常用的方法。

  RedirectToLoginPage方法用于从任何页面重定向到登录页,该方法有两种重载方式:

 

public static void RedirectToLoginPage ()

public static void RedirectToLoginPage (string extraQueryString)

 

  两种方式均会使浏览器重定向到登录页(登录页的URL<forms>节点的loginUrl属性指出)。第二种重载方式还能够提供额外的查询字符串。

  RedirectToLoginPage通常在任何非登录页的页面中调用。该方法除了进行重定向之外,还会向URL中附加一个ReturnUrl参数,该参数即为调用该方法时所在的页面的URL地址。这是为了方便登录后能够自动回到登录前所在的页面。

  RedirectFromLoginPage方法用于从登录页跳转回登录前页面。这个“登录前”页面即由访问登录页时提供的ReturnUrl参数指定。如果没有提供ReturnUrl参数(例如,不是使用RedirectToLoginPage方法而是用其他手段重定向到或直接访问登录页时),则该方法会自动跳转到由<forms>节点的defaultUrl属性所指定的默认页。

  此外,如果<forms>节点的enableCrossAppRedirects属性被设置为falseReturnUrl参数所指定的路径必须是当前Web应用程序中的路径,否则(如提供其他站点下的路径)也将返回到默认页。

  RedirectFromLoginPage方法有两种重载形式:

 

public static void RedirectFromLoginPage (string userName, bool createPersistentCookie)

public static void RedirectFromLoginPage (string userName, bool createPersistentCookie, string strCookiePath)

 

  userName参数表示用户的标识(如用户名、用户ID等);createPersistentCookie参数表示是否“记住我”;strCookiePath参数表示Cookie路径。

  RedirectFromLoginPage方法除了完成重定向之外,还会将经过加密(是否加密取决于<forms>节点的protection属性)的用户凭据存放到CookieUri中。在后续访问中,只要Cookie没有过期,则将可以通过HttpContext.User.Identity.Name属性得到这里传入的userName属性。

  此外,FormsAuthentication还有一个SignOut方法,用于完成用户注销。其原理是从CookieUri中移除用户凭据。

 

小结

  好了,至此所需要掌握的基础知识就齐备了,接下来我们将实现用户注册、登录等功能。

[教程]ASP.net Membership角色与权限管理

mikel阅读(664)

http://www.sosuo8.com/article/show.asp?id=850&page=0
本文目录:
1.membership简介
2.membership在SQL server中的设置
3.配置web.config
4.创建用户CreateUserWizard控件
5.用户登录login控件
6.显示当前用户的名称LoginName控件
7.检测用户的身份验证状态的LoginStatus控件
8.为不同类别用户呈现不同内容的LoginView控件
9.更改密码的ChangePassword控件
10.自助找回密码的PasswordRecovery控件
11.总结

[MVC]Microsoft ASP.NET MVC中Membership登陆的实现

mikel阅读(737)

开发平台:

VS2008 RTM

SQL SERVER 2005 企业版

ASP.NET 3.5 Extensions CTP

MVCToolkit

 

1.新建一个MVC的工程,随便取个名字吧

2.建立SQL数据库,命名为mvc_test

3.运行C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_regSQL.exe来生成该数据库的Membership结构

下一步后点击完成.

4.到这里Membership的结构已经生成好了

5.下面在Web.Config中加入SQL连接字符串

<connectionStrings>

<remove name="LocalSQLServer" />

<add name="LocalSQLServer" connectionString="Data Source=.;Initial Catalog=mvc_test;Persist Security Info=True;User ID=sa;Password=" providerName="System.Data.SqlClient" />

 

</connectionStrings>

 

 

这里注意不要修改配置的name="LocalSqlServer"

 

 

6.继续在Web.Config中加入membership的配置节点(system.web节点下添加)

 

<membership defaultProvider="SQLMembershipProvider">

<providers>

<add name="SQLMembershipProvider" passwordFormat="Clear" type="System.Web.Security.SqlMembershipProvider" connectionStringName=" LocalSQLServer " applicationName="mvc_test" enablePasswordRetrieval="true" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="false" minRequiredPasswordLength="4" minRequiredNonalphanumericCharacters="0"/>

</providers>

 

        </membership>

 

 

 

7. 将<authentication mode="Windows"/>改为<authentication mode="Forms"/>

 

 

 

8.在Views/Home目录下建立一个MVC View Content Page,命名为Login.aspx

 


 


 

 

接着选取Views/Shared/Site.Master母版页

 

 

8.Login.aspx这个页面放入一个User Control就行了.所以还要建一个MVC View User Control

 

 

命名为Login.ascx,建立在Views/Shared目录下面

 


 

 

 

9.将以下代码替换自动生成的:

 

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %>

<%if (!Page.User.Identity.IsAuthenticated)

{%>

<form action='<%= Url.Action( new { Action="Login",Controller="Home"}) %>' method="post">

用户名:<%=Html.TextBox("Username")%>

密码:<%=Html.Password("Password")%><%= ViewData.ContainsDataItem("Message")? ViewData["Message"]:""%><%=Html.SubmitButton("Submit", "确定")%>

</form>

<%}

else

{%>

<span>您好!

<%=Page.User.Identity.Name %> <%=Html.ActionLink<MVC_Login.Controllers.HomeController>(c => c.Logout()

, "退出登陆", new { id = "LogoutLink" })%></span>

<%} %>

 

 

10.引用User Control 的方法是

<%= Html.RenderUserControl("~/Views/Shared/Login.ascx") %>

将这条代码加到Login.aspx和母版页合适位置.

 

11.打开Controllers/HomeController.cs文件

加入以下2个 controller action

[ControllerAction]

public void Login()

{

if (!ControllerContext.HttpContext.User.Identity.IsAuthenticated)

{

if (Request.RequestType == "POST")

{

string userName = Request.Form["Username"];

string password = Request.Form["Password"];

 

if (Membership.ValidateUser(userName, password))

{

FormsAuthentication.SetAuthCookie(userName, true);

//Set cookie and redirect

RedirectToAction("Index");

}

else

{

ViewData.Add("Message", "用户名或密码错误");

}

}

}

RenderView("Login");

}

 

[ControllerAction]

public void Logout()

{

FormsAuthentication.SignOut();

RedirectToAction("Index");

}

 

12.接下来从网上下载MVCToolkit.dll,没有这个是绝对不行滴~

下载地址: http://asp.net/downloads/3.5-extensions/MVCToolkit.zip

将里面的MVCToolkit.dll引用一下.现在可以运行了.

 

 

 

 

 

 

对了.自己先建一个Membership用户进行测试,MVC的注册还没有做

[Flex]Flex4下载

mikel阅读(809)

代号:Gumbo
Gumbo

The next version of Flex, code name Gumbo, is now in active development. It is has 3 primary themes:
* Design in Mind: provide a framework meant for continuous collaboration between designer and developer.
* Developer Productivity: improve compiler performance and add productivity enhancements to language features like data binding
* Framework Evolution: take advantage of new Flash Player capabilities and add features required by common use-cases
Next steps
1. Watch a presentation on the Gumbo plan (~14 mins)
2. See Ely Greenfield discuss designer/developer improvements
3. Read a longer description of the Gumbo themes
4. View and comment on the specifications
Download builds of Gumbo from here
http://opensource.adobe.com/wiki/display/flexsdk/Gumbo

[文档]MSDN中的where泛型类型约束

mikel阅读(746)

在泛型类型定义中,where 子句用于指定对下列类型的约束:这些类型可用作泛型声明中定义的类型参数的实参。例如,可以声明一个泛型类 MyGenericClass,这样,类型参数 T 就可以实现 IComparable<(Of <(T>)>) 接口:

  “复制”图像复制代码
public class MyGenericClass<T> where T:IComparable { }

注意注意:

有关查询表达式中的 where 子句的更多信息,请参见 where 子句(C# 参考)

除了接口约束,where 子句还可以包括基类约束,以指出某个类型必须将指定的类作为基类(或者就是该类本身),才能用作该泛型类型的类型参数。这样的约束一经使用,就必须出现在该类型参数的所有其他约束之前。

  “复制”图像复制代码
class MyClass<T, U>
where T : class
where U : struct
{
}

where 子句还可以包括构造函数约束。可以使用 new 运算符创建类型参数的实例;但类型参数为此必须受构造函数约束 new() 的约束。new() 约束可以让编译器知道:提供的任何类型参数都必须具有可访问的无参数(或默认)构造函数。例如:

  “复制”图像复制代码
using System;
public class MyGenericClass <T> where T: IComparable, new()
{
// The following line is not possible without new() constraint:
T item = new T();
}

new() 约束出现在 where 子句的最后。

对于多个类型参数,每个类型参数都使用一个 where 子句,例如:

  “复制”图像复制代码
using System;
using System.Collections;
interface IMyInterface
{
}
class Dictionary<TKey,TVal>
where TKey: IComparable, IEnumerable
where TVal: IMyInterface
{
public void Add(TKey key, TVal val)
{
}
}

还可以将约束附加到泛型方法的类型参数,例如:

  “复制”图像复制代码
public bool MyMethod<T>(T t) where T : IMyInterface { }

请注意,对于委托和方法两者来说,描述类型参数约束的语法是一样的:

  “复制”图像复制代码
delegate T MyDelegate<T>() where T : new()

[资源]CMS系统架构

mikel阅读(1249)

joe.zhang 投递 "作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com
写于:2003/03 最后更新:
07/27/2004 11:17:25 Feed Back >> 
Creative Commons License

版权声明:可以任意转载,转载时请务必以超链接形式标明文章原始出处和作者
信息及本声明
http://www.chedong.com/tech/cms.html
关键词:"content manage system" cms 内容管理系统
内容摘要:


内容管理系统概述
内容管理系统是一个很泛的概念:从商业门户网站的新闻系统到个人的Weblog都可以称作发布系统。

  • 框架型:本身不包含任何应用实现,只是提供了底层框架,具体应用需要一定的二次开发,比如Cocoon,Vignette;
  • 应用型:本身是一个面向具体类型的应用实现,已经包含了新闻/评论管理,投票,论坛,WIKI等一些子系统。比如:postNuke xoops等;


但 无论如何,在发布系统选型之前,首先了解自己的实际需求是最重要的:想根据现成系统将自己的需求硬往上照搬是非常不可取的。访问量,权限控制和各种功能需 求。每个模块和功能自己都比较清晰一点以后,再去网上找找类似的实现:你会发现其实每个环节到目前上都有比较成熟的实现了,而且还在不断完善和发展中,如 果没有:你的需求太特殊,或者可以尝试分解成更小的系统组合实现。
内容管理系统被分离成以下几个层面:各个层面优先考虑的需求不同

  1. 后台业务子系统管理(管理优先:内容管理):新闻录入系统,BBS论坛子系统,全文检索子系统等,针对不同系统的方便管理者的内容录入:所见即所得的编辑管理界面等,清晰的业务逻辑:各种子系统的权限控制机制等;
  2. Portal系统(表现优先:模板管理):大部分最终的输出页面:网站首页,子频道/专题页,新闻详情页一般就是各种后台子系统模块的各种组合,这种发布组合逻辑是非常丰富的,Portal系统就是负责以上这些后台子系统的组合表现管理;
  3. 前台发布(效率优先:发布管理):面向最终用户的缓存发布,和搜索引擎spider的URL设计等……

内 容管理和表现的分离:很多成套的CMS系统没有把后台各种子系统和Portal分离开设计,以至于在Portal层的模板表现管理和新闻子系统的内容管理 逻辑混合在一起,甚至和BBS等子系统的管理都耦合的非常高,整个系统会显得非常庞杂。而且这样的系统各个子系统捆绑的比较死,如果后台的模块很难改变。 但是如果把后台各种子系统内容管理逻辑和前台的表现/发布分离后,Portal和后台各个子系统之间只是数据传递的关系:Portal只决定后台各个子系 统数据的取舍和表现,而后台的各个子系统也都非常容易插拔。
内容管理和数据分发的分离:需要要Portal系统设计的时候注意可缓存性(Cache Friendly)性设计:CMS后台管理和发布机制,本身不要过多考虑“效率”问题,只要最终页面输出设计的比较Cacheable,效率问题可通过更前端专门的缓存服务器解决。
此外,就是除了面向最终浏览器用户外,还要注意面向搜索引擎友好(Search engine Friendly)的URL设计:通过URL REWRITE转向或基于PATH_INFO的参数解析使得动态网页在链接(URI)形式上更像静态的目录结构,方便网站内容被搜索引擎收录;
————— ————— —————
|新闻管理子系统| | BBS论坛子系统| | 商城子系统 |
————— ————— —————
| / | / 内
| ———-|— / 容 | / | / 管
————— | ————— 理
|专题制作子系统| | |全文检索子系统|
————— | —————
| /
————————-|———————————————
| / 频
————— 道 | Portal 系统 | 管
————— 理
|
————————-|———————————————
| 前
| 台 ————— 发
|前台发布系统 | 布
—————
/
/
————— —————
| 用户浏览器 | |Search Engine|
————— —————
这里,我把在内容发布系统选型中找到的一些资料总结如下:

内容管理系统的选型
关键词:CMS Content Manage System
CMS行业研究
http://www.cmswatch.com
http://www.cmsreview.com
http://www.cmsinfo.org
CMS讨论邮件列表
http://www.cms-list.org
商业软件和开源项目列表:
http://directory.google.com/Top/Computers/Software/Internet/Site_Management/Content_Management/
推荐:基于XML的发布框架
http://cocoon.apache.org/
具体实现复杂程度可能会根据需求的不同而不同,但越是大型的系统越是需要分工:将内容(数据),表现(模板)和应用逻辑(程序)尽可能分离和对这3 者的管理。
Portal—门户系统
Open source Projects:
http://jportlet.sourceforge.net/
Apache Software Foundation: Jakarta JetSpeed 1.3
JetSpeed home page: http://jakarta.apache.org/jetspeed/site/index.html
JetSpeed Portlet API: http://cvs.apache.org/viewcvs/jakarta-jetspeed/proposals/portletAPI/
http://www.liferay.com/home/index.jsp
http://basicPortal.com/
http://www.jahia.org/
http://jporta.sourceforge.net/
商业软件:
BEA WebLogic Portal – http://edocs.bea.com/wlp/docs81/javadoc/com/bea/Portal/model/Portlet.html
IBM Websphere Portal – http://www.software.ibm.com/wsdd/zones/Portal/
Oracle Portal Developer Kit – http://Portalstudio.oracle.com/
其它:
PSML – http://jakarta.apache.org/jetspeed/site/psml.html
BEA: Web Logic Portal 4.0 http://www.bea.com/products/weblogic/Portal/index.shtml
IBM: WebSphere Portal 2.1 http://www-4.ibm.com/software/webservers/Portal/
iPlanet: iPlanet Portal Server 3.0 http://www.iplanet.com/products/iplanet_Portal/home_Portal.html
Oracle: oracle 9i Portal http://www.oracle.com/ip/deploy/ias/Portal/index.html
SAP Portal: http://www.iviewstudio.com
Epicentric Portal: http://www.epicentric.com/solutions/products/efs/
参考:
Wafer:Java开发框架研究
http://www.waferproject.org/index.html
门户(Portal)系统相关开发框架:
http://udoo.51.net/mt/archives/000011.html
广告管理系统
关键词:ad server
广告系统和内容的分离,可以大大降低系统之间的关联度。
 
专业行业研究网站:
http://adres.internet.com
相关厂商和开源项目:
http://directory.google.com/Top/Computers/Programming/Languages/PHP/Scripts/Ad_Management/?il=1
http://directory.google.com/Top/Computers/Software/Internet/Servers/Advertising/?tc=1
http://www.jspin.com/home/apps/admanage?cob=winedit
http://www.scriptdex.com/dex/php_ad_management.shtml
推荐:
http://www.phpadsnew.com/ 功能性比较强
http://oasis.sourceforge.net/ 免费 基于日志记录和定期导入MYSQL统计,可以负载50万请求/每小时 以上
如果看重广告的第3方特性,可以选择第三方服务:
http://www.doubleclick.net/
http://www.allyes.com/
论坛/社区系统 关键词: BBS FORUM
论坛软件介绍:
http://directory.google.com/Top/Computers/Internet/Web_Design_and_Development/Message_Boards/
推荐:
http://www.phpBB.com PHP + MySQL open source
http://www.vbulletin.com/order/ PHP + MySQL  有付费的商业支持85-160$
http://www.jivesoftware.com/products/pricing.jsp 商业论坛系统,1000$-2500$ 有知识库扩展应用
http://yazd.yasna.com/features.jsp 基于 Java
所见即所得(WYSIWYG)编辑器在内容的录入管理方面,所见即所得是比较重要的,这样可以大大简化对系统中布局排版的需求。
基于浏览器的WYSIWYG(所见即所得)编辑器是CMS设计中,编辑工具的主要考虑方面。目前主要是通过JavaScript调用IE或其他浏览器的内置方法实现。其中基于IE5.5浏览器的实现最为简洁。这里有一个完整的例子:
Building a WYSIWYG HTML Editor Part 1/2
Building a WYSIWYG HTML Editor Part 2/2
主要功能:

  • 能够通过JavaScript实现的基本功能:加粗,斜体字,居中,添加链接,添加图片,模式切换:HTML和文本模式的切换,
  • Word垃圾代码过滤
  • 图片上载接口:图片上载最好通过其他独立模块实现。

选型指标:

  • 不依赖服务器端代码:只通过JavaScript或客户端控件实现代码,可以保证以后系统迁移的方便。
  • WORD垃圾代码过滤

可视化编辑器大全:
http://www.bris.ac.uk/is/projects/cms/ttw/ttw.html
推荐:
http://www.aine.be/aynhtml/
图片/文件上传组建图片和文件等非结构化数据还是分别使用另外的服务解决比较好。这样可以大大简化CMS本身的复杂程度。
推荐:
文件上传:
Apache Commons项目
http://jakarta.apache.org/commons/
ImageJ:图片处理缩略图生成和水印等
http://rsb.info.nih.gov/ij/
关于Blog系统的选型,目前主流的基于PHP的包括:
· Nucleus 3.0 www.nucleuscms.org
· pmachine 2.3 www.pmachine.com
· b2evolution 0.9.0.3 www.b2evolution.net
· Serendipity 0.6 www.s9y.org
· WordPress 1.2 www.wordpress.org
· bBlog 0.7.3 www.bblog.com
· pLog 0.3.1 www.plogworld.org
· Simplog .9 www.simplog.org
· Textpattern 1.18a www.textpattern.com 原文出处:http://www.chedong.com/tech/cms.html

[问题]FSO组件不可用的解决方案

mikel阅读(653)

解决办法:
权限出现了问题,打开注册表加入权限!
在 开始-运行中敲入regedit,然后找到HKEY_CLASSES_ROOT\Scripting.FileSystemObject
右击权限,加入everyone用户并有”写入,完全控制的权限”确定,然后重新启动IIs即可搞定!

[资源]Flash 3D引擎

mikel阅读(757)

Flash 3D 应用目前是一个趋势,多半是使用以下几个引擎。
毫无疑问,Flash 10 (CS4) 也会支持一些 3D 特性.
只不过是软模拟,而非真正意义上的 3D.

欢迎补充…

 P.S.顺便推荐一个应用演示:
Spectra visual newsreader


[Flex]使用FLEX的HttpService与ASP.NET进行动态交互之一

mikel阅读(667)

现在RIA技术可以说在互联网上是风风火火,adobe公司有FLEX,微软有银光。现在可以说是个有个的好处,不过做为互联网上最为风行的FLASH,我想它的支持率是大家有目共睹的,银光虽好,不过也得需要个一二年的成熟期哪。

以前我在cnblogs上搜过是否有FLEX的文章,找到的比较少,记得好像是大部分都是采用了WEBSERVICE或者是WCF来实现的,关于HTTPService实现的方法就比较少了,也许各位大侠比较喜欢用webserivce吧。

首先我先介绍一下什么是httpservice,flex中的httpservice通信方式,说白了就是采用get与post方法进行数据传送, 和我们平时用的表单提交没有什么不同。httpservice对象位于mx.rpc.http包中,它主要用来发送http形式的get或post请求. 对POST与GET的区别我就不说了,我想大部分都是明白的,这种方式最大的好处就是通用性高,不管它是PHP、ASP、JSP或者是我心爱的 ASP.NET都可以对FLEX提交过来的数据进行处理与回递。

在FLEX程序中,想要使用httpservice对象很方便,格式如下:

<mx:HttpService id="userRegForm" url="useradd.aspx" method="get|post">

以上是最简单的写法,还有一种就是用XML来写,请看下文:

   1:      <mx:HTTPService showBusyCursor="true"
   2:                      id="getuser" result=""
   3:                      url="http://localhost:6666/Default.aspx">
   4:          <mx:request>
   5:              <username>
   6:   
   7:              </username>
   8:              <userpassword>
   9:   
  10:              </userpassword>
  11:          </mx:request>
  12:      </mx:HTTPService>
这里面有许多的属性可能大家不是很清楚,我来一一给大家解释:
ShowBusyCursor属性是指在提交请求时,是否显示忙碌的状态
id比较好理解它就是这个httpservice请求的标示
result是指请求之后的回调方法,主要是发送请求之后,需要得到一个结果
URl是发送的地址
<mx:request>中主要发着一些请求参数,相信大家也能看得懂。
当我们有了这些基础之后,我们就可以来编写一个最简单的FLEX交互程序了,首先打FLEX,先做一个界面,界面的样式如下图:
Snap1 
具体的代码:
   1:  <?xml version="1.0" encoding="utf-8"?>
   2:  <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute"
width="320" height="219">
   3:      <mx:HTTPService showBusyCursor="true"
   4:       id="getuser" result="getuserproc();"
   5:        url="http://localhost:6666/Default.aspx">
   6:          <mx:request>
   7:              <username>
   8:                  {this.txtUserName.text}
   9:              </username>
  10:              <userpassword>
  11:                  {this.txtUserPassWord.text}
  12:              </userpassword>
  13:          </mx:request>
  14:      </mx:HTTPService>
  15:      <mx:Script>
  16:          <![CDATA[
  17:          import mx.controls.Alert;
  18:          
  19:              public function getuserproc():void
  20:              {
  21:                  var returnValue:String=getuser.lastResult.Result.chu888;
  22:                  if(returnValue=="ok")
  23:                  {
  24:              Alert.show("您成功的登录了","提示信息",Alert.OK,this,null,null,Alert.YES);
  25:                  }
  26:                  else
  27:                  {
  28:              Alert.show("您的登录失败了","提示信息",Alert.OK,this,null,null,Alert.YES);
  29:                  }
  30:              }
  31:          ]]>
  32:      </mx:Script>
  33:      <mx:Panel id="UserRegPanel" x="9.15" y="9.05" width="302" 
  34:                height="204" layout="absolute">
  35:          <mx:Label x="10" y="22" text="用户名:" id="lblUserName" 
  36:                    enabled="true" fontSize="15"/>
  37:          <mx:Label x="10" y="64" text="密   码:" id="lblUserPassWord" 
  38:                    enabled="true" fontSize="15"/>
  39:          <mx:TextInput x="83" y="22" fontSize="15" id="txtUserName"/>
  40:          <mx:TextInput x="83" y="63" fontSize="15" id="txtUserPassWord"/>
  41:          <mx:Button x="96.45" y="108" label="登录" width="89" height="36" 
  42:                     fontSize="15" enabled="true" click="getuser.send()">
  43:              <mx:icon>@Embed(source='../libs/001_54.png')</mx:icon>
  44:          </mx:Button>
  45:      
  46:      </mx:Panel>
  47:  </mx:Application>
流程处理:
演示文稿1 
之后哪,我们新建一个Default.aspx的页面,页面内容很简单,代码如下:
   1:  namespace WebApplication4
   2:  {
   3:      public partial class _Default : System.Web.UI.Page
   4:      {
   5:          protected void Page_Load(object sender, EventArgs e)
   6:          {
   7:              if (Request.QueryString["username"].Equals("chu888"))
   8:              {
   9:                  Response.Write("<Result>");
  10:                  Response.Write("<chu888>ok</chu888>");
  11:                  Response.Write("</Result>");
  12:              }
  13:              else
  14:              {
  15:                  Response.Write("<Result>");
  16:                  Response.Write("<chu888>error</chu888>");
  17:                  Response.Write("</Result>");
  18:              }
  19:          }
  20:      }
  21:  }
之后哪,将Flex的内容发布,附加到ASP.NET的程序即可,这里面有一个地方,需要大家注意的就是,由于每一次ASP.NET的文件服务器产生
的端口是不一样的,你需要将端口固定,要不然你的程序会出现找不到程序的。
Snap2