« 前一篇:转载
后一篇:What Does Your Name Mean? »

网络应用程序访问共享资源 @ 6/27/2006

技术类
对于需要支持大存储空间和大访问量的网站来说,服务器架构可以采用下图的模式:


框架的详细描述参见:
Deploying and Configuring Internet Information Services (IIS) 6.0 with Remotely Stored Content on UNC Servers and NAS Devices

具体到实现,只有一个难点:在IIS上的网络应用程序中访问共享资源。

首先,设置Web.config,使网络应用程序可以模拟真实用户访问共享资源:
<identity impersonate="true" userName="吴雨" password="cyifyr(AT)gmail(DOT)com"/>

其次,通过如下方式访问共享资源:
//file: NetShareAccess.cs
using System;
using System.Runtime.InteropServices;

/// <summary>
/// 访问网络共享资源工具类
/// </summary>
public class NetShareAccess {
    #region 公共接口
    /// <summary>
    /// 构造函数
    /// </summary>
    /// <param name="resource">网络共享资源地址(如:\\192.168.1.1\Share)</param>
    /// <param name="user">用于登陆网络共享资源地址的用户名</param>
    /// <param name="pass">用于登陆网络共享资源地址的用户密码</param>
    public NetShareAccess(string resource, string user, string pass) {
        if(string.IsNullOrEmpty(resource) || string.IsNullOrEmpty(user)) {
            throw new Exception("Params Empty");
        }
        Resource = resource;
        uint ret = WNetAddConnection(resource, user, pass);
        hasAccess = (ret == 1200);
    }

    /// <summary>
    /// 实现 IDisposable 接口.
    /// </summary>
    public void Dispose() {
        WNetCancelConnection(Resource, true);
        GC.SuppressFinalize(this);
    }

    /// <summary>
    /// 是否允许访问
    /// </summary>
    public bool HasAccess {
        get {
            return hasAccess;
        }
    }
    #endregion

    #region 导入接口
    [DllImport("mpr.dll", EntryPoint = "WNetAddConnection")]
    private extern uint WNetAddConnection(
        string lpName,
        string lpPassword,
        string lpUsername);

    [DllImport("mpr.dll", EntryPoint = "WNetCancelConnection")]
    private extern uint WNetCancelConnection(
        string lpName,
        bool bForce);
    #endregion
}

使用示例:
//file: ReadFile.aspx.cs
public partial class ReadFile: System.Web.UI.Page {
    protected void Page_Load(object sender, EventArgs e) {
        using(NetShareAccess access = new NetShareAccess(@"\\192.168.1.1\Data", "cyifyr", "@gmail(dot)com")) {
            if(access.HasAccess) {
                Response.ContentType = "image/jpeg";
                Response.WriteFile(@"\\192.168.1.1\Data\2006WorldCup.jpg", true);
            }
        }
    }
}
发布于 6/27/2006 19:31:36 | 评论:0

看帖要回帖...

categories
archives
links
statistics
  • 网志数:1168
  • 评论数:2011