menu

秋梦无痕

一场秋雨无梦痕,春夜清风冻煞人。冬来冷水寒似铁,夏至京北蟑满城。

Avatar

网络应用程序访问共享资源

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

框架的详细描述参见:
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);
}
}
}
}

评论已关闭