ASP.NET 3.5 unleashed-6-HTTP运行库
BuildProvider:负责具有特定扩展名且保存在特定文件夹中的文件
using System.Web.Compilation;
using System.CodeDom;
public class DataBuildProvider : BuildProvider
public override void GenerateCode(AssemblyBuilder ab)
示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System;
using System.Collections.Generic;
using System.Web.Compilation;
using System.CodeDom;
using System.Xml;
using System.IO;
using System.Web.Hosting;
namespace AspNetUnleashed
{
public class DataBuildProvider : BuildProvider
{
string _className;
public override void GenerateCode(AssemblyBuilder ab)
{
// Load the XML file
XmlDocument xmlData = new XmlDocument();
xmlData.Load(HostingEnvironment.MapPath(this.VirtualPath));
// Generate code from XML document
CodeCompileUnit dataCode = GetDataCode(xmlData);
// Add the code
ab.AddCodeCompileUnit(this, dataCode);
}
private CodeCompileUnit GetDataCode(XmlDocument xmlData)
{
// Add class
_className = Path.GetFileNameWithoutExtension(this.VirtualPath);
CodeTypeDeclaration dataType = new CodeTypeDeclaration(_className);
dataType.IsPartial = true;
// Add constructor
AddConstructor(dataType);
// Add properties
AddProperties(dataType, xmlData);
// Add Select method
AddSelect(dataType, xmlData);
// Add Select with conString overload
AddSelectConString(dataType, xmlData);
// Create namespace
CodeNamespace dataNS = new CodeNamespace("Data");
// Add class to namespace
dataNS.Types.Add(dataType);
// Create code unit
CodeCompileUnit dataCode = new CodeCompileUnit();
// Add namespace to code unit
dataCode.Namespaces.Add(dataNS);
// Add default namespaces
dataNS.Imports.Add(new CodeNamespaceImport("System"));
return dataCode;
}
private void AddConstructor(CodeTypeDeclaration dataType)
{
// Add default constructor method
CodeConstructor classConstructor = new CodeConstructor();
classConstructor.Attributes = MemberAttributes.Public;
dataType.Members.Add(classConstructor);
}
private void AddProperties(CodeTypeDeclaration dataType, XmlDocument xmlData)
{
foreach (XmlElement el in xmlData.DocumentElement.ChildNodes)
{
string propName = el.Attributes["name"].Value;
string propType = "System.String";
if (el.HasAttribute("type"))
propType = el.Attributes["type"].Value;
// Add backing field
string propFieldName = "_" + propName;
CodeMemberField field = new CodeMemberField(propType, propFieldName);
dataType.Members.Add(field);
// Add property
CodeMemberProperty prop = new CodeMemberProperty();
dataType.Members.Add(prop);
prop.Name = propName;
prop.Type = new CodeTypeReference(propType);
prop.Attributes = MemberAttributes.Public;
// Add Get
CodeMethodReturnStatement getMethod = new CodeMethodReturnStatement();
CodeFieldReferenceExpression refField = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), propFieldName);
getMethod.Expression = refField;
prop.GetStatements.Add(getMethod);
// Add Set
CodeAssignStatement setMethod = new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), propFieldName), new CodePropertySetValueReferenceExpression());
prop.SetStatements.Add(setMethod);
}
}
private void AddSelect(CodeTypeDeclaration dataType, XmlDocument xmlData)
{
// Create Select method
CodeMemberMethod selectMethod = new CodeMemberMethod();
selectMethod.Name = "Select";
selectMethod.Attributes = MemberAttributes.Static | MemberAttributes.Public;
selectMethod.Parameters.Add(new CodeParameterDeclarationExpression("System.Data.SqlClient.SqlConnection", "con"));
CodeVariableReferenceExpression refCon = new CodeVariableReferenceExpression("con");
AddSummaryComment(selectMethod, "Returns List of " + _className);
// Specify return type
CodeTypeReference refList = new CodeTypeReference("System.Collections.Generic.List", new CodeTypeReference[] { new CodeTypeReference(_className) });
selectMethod.ReturnType = refList;
// Add List collection for results
CodeVariableDeclarationStatement initResults = new CodeVariableDeclarationStatement(refList, "results", new CodeObjectCreateExpression(refList));
selectMethod.Statements.Add(initResults);
CodeVariableReferenceExpression refResults = new CodeVariableReferenceExpression("results");
// Add Command object
CodeVariableDeclarationStatement initCmd = new CodeVariableDeclarationStatement("System.Data.SqlClient.SqlCommand", "cmd", new CodeObjectCreateExpression("System.Data.SqlClient.SqlCommand"));
selectMethod.Statements.Add(initCmd);
CodeVariableReferenceExpression refCmd = new CodeVariableReferenceExpression("cmd");
CodeAssignStatement addCmdCon = new CodeAssignStatement(new CodePropertyReferenceExpression(refCmd, "Connection"), refCon);
selectMethod.Statements.Add(addCmdCon);
CodeVariableDeclarationStatement initCmdText = new CodeVariableDeclarationStatement(typeof(string), "cmdText", new CodePrimitiveExpression(GetCommandText(xmlData)));
selectMethod.Statements.Add(initCmdText);
CodeAssignStatement addCmdText = new CodeAssignStatement(new CodePropertyReferenceExpression(refCmd, "CommandText"), new CodeVariableReferenceExpression("cmdText"));
selectMethod.Statements.Add(addCmdText);
// Init SqlDataReader
CodeMethodInvokeExpression cmdExec = new CodeMethodInvokeExpression(refCmd, "ExecuteReader");
CodeVariableDeclarationStatement initReader = new CodeVariableDeclarationStatement("System.Data.SqlClient.SqlDataReader", "reader", cmdExec);
selectMethod.Statements.Add(initReader);
CodeVariableReferenceExpression refReader = new CodeVariableReferenceExpression("reader");
// Create While Loop
CodeVariableDeclarationStatement initCounter = new CodeVariableDeclarationStatement("System.Int32", "counter");
selectMethod.Statements.Add(initCounter);
CodeVariableReferenceExpression refLoopCounter = new CodeVariableReferenceExpression("counter");
CodeAssignStatement loopInit = new CodeAssignStatement(refLoopCounter, new CodePrimitiveExpression(0));
CodeMethodInvokeExpression loopTest = new CodeMethodInvokeExpression(refReader, "Read");
CodeAssignStatement loopIncrement = new CodeAssignStatement(refLoopCounter, new CodeBinaryOperatorExpression(refLoopCounter, CodeBinaryOperatorType.Add, new CodePrimitiveExpression(1)));
CodeIterationStatement loop = new CodeIterationStatement(loopInit, loopTest, loopIncrement);
selectMethod.Statements.Add(loop);
// Create object
CodeVariableDeclarationStatement initRecord = new CodeVariableDeclarationStatement(_className, "record", new CodeObjectCreateExpression(_className));
CodeVariableReferenceExpression refRecord = new CodeVariableReferenceExpression("record");
loop.Statements.Add(initRecord);
// Loop through properties
foreach (XmlElement el in xmlData.DocumentElement.ChildNodes)
{
string propName = el.Attributes["name"].Value;
string propType = "System.String";
if (el.HasAttribute("type"))
propType = el.Attributes["type"].Value;
CodeIndexerExpression refIndexer = new CodeIndexerExpression(refReader, new CodePrimitiveExpression(propName));
CodeCastExpression castIt = new CodeCastExpression(propType, refIndexer);
CodePropertyReferenceExpression refProp = new CodePropertyReferenceExpression(refRecord, propName);
CodeAssignStatement assignProp = new CodeAssignStatement(refProp, castIt);
loop.Statements.Add(assignProp);
}
// add record to collection
CodeMethodInvokeExpression invokeAdd = new CodeMethodInvokeExpression(refResults, "Add", new CodeExpression[] { refRecord });
loop.Statements.Add(invokeAdd);
// Return results
CodeMethodReturnStatement ret = new CodeMethodReturnStatement(refResults);
selectMethod.Statements.Add(ret);
// Add the Select method to the class
dataType.Members.Add(selectMethod);
}
private void AddSelectConString(CodeTypeDeclaration dataType, XmlDocument xmlData)
{
// Create Select method
CodeMemberMethod selectMethod = new CodeMemberMethod();
selectMethod.Name = "Select";
selectMethod.Attributes = MemberAttributes.Static | MemberAttributes.Public;
selectMethod.Parameters.Add(new CodeParameterDeclarationExpression("System.String", "connectionStringName"));
AddSummaryComment(selectMethod, "Returns List of " + _className);
CodeVariableReferenceExpression refConStringName = new CodeVariableReferenceExpression("connectionStringName");
// Specify return type
CodeTypeReference refList = new CodeTypeReference("System.Collections.Generic.List", new CodeTypeReference[] { new CodeTypeReference(_className) });
selectMethod.ReturnType = refList;
// Add List collection for results
CodeVariableDeclarationStatement initResults = new CodeVariableDeclarationStatement(refList, "results", new CodeObjectCreateExpression(refList));
selectMethod.Statements.Add(initResults);
CodeVariableReferenceExpression refResults = new CodeVariableReferenceExpression("results");
// Get connection string setting
CodeTypeReferenceExpression refConStrings = new CodeTypeReferenceExpression("System.Web.Configuration.WebConfigurationManager");
CodePropertyReferenceExpression refPropConStrings = new CodePropertyReferenceExpression(refConStrings, "ConnectionStrings");
CodeIndexerExpression conString = new CodeIndexerExpression(refPropConStrings, refConStringName);
CodeVariableDeclarationStatement initConStringSetting = new CodeVariableDeclarationStatement("System.Configuration.ConnectionStringSettings", "conStringSettings", conString);
selectMethod.Statements.Add(initConStringSetting);
CodeVariableReferenceExpression refConStringSettings = new CodeVariableReferenceExpression("conStringSettings");
// Get connection string
CodePropertyReferenceExpression refPropConString = new CodePropertyReferenceExpression(refConStringSettings, "ConnectionString");
CodeVariableDeclarationStatement initConString = new CodeVariableDeclarationStatement("System.String", "conString", refPropConString);
selectMethod.Statements.Add(initConString);
CodeVariableReferenceExpression refConString = new CodeVariableReferenceExpression("conString");
// Create connection object
CodeVariableDeclarationStatement initCon = new CodeVariableDeclarationStatement("System.Data.SqlClient.SqlConnection", "con", new CodeObjectCreateExpression("System.Data.SqlClient.SqlConnection"));
selectMethod.Statements.Add(initCon);
CodeVariableReferenceExpression refCon = new CodeVariableReferenceExpression("con");
// Assign connection string
CodeAssignStatement addConString = new CodeAssignStatement(new CodePropertyReferenceExpression(refCon, "ConnectionString"), refConString);
selectMethod.Statements.Add(addConString);
// Add Try
CodeTryCatchFinallyStatement tryBlock = new CodeTryCatchFinallyStatement();
selectMethod.Statements.Add(tryBlock);
// Open Connection
CodeMethodInvokeExpression conOpen = new CodeMethodInvokeExpression(refCon, "Open");
tryBlock.TryStatements.Add(conOpen);
// Call Select with connection
CodeTypeReferenceExpression refMe = new CodeTypeReferenceExpression(_className);
CodeMethodReferenceExpression refSelect = new CodeMethodReferenceExpression(refMe, "Select");
CodeMethodInvokeExpression invokeSelect = new CodeMethodInvokeExpression(refSelect, new CodeExpression[] { refCon });
// Assign results to local variable
CodeAssignStatement assignResults = new CodeAssignStatement(refResults, invokeSelect);
tryBlock.TryStatements.Add(assignResults);
// Close Connection
CodeMethodInvokeExpression conClose = new CodeMethodInvokeExpression(refCon, "Close");
tryBlock.FinallyStatements.Add(conClose);
// Return results
CodeMethodReturnStatement ret = new CodeMethodReturnStatement(refResults);
selectMethod.Statements.Add(ret);
// Add the Select method to the class
dataType.Members.Add(selectMethod);
}
private string GetCommandText(XmlDocument xmlData)
{
string tableName = xmlData.DocumentElement.Name;
List<String> columns = new List<String>();
foreach (XmlElement el in xmlData.DocumentElement.ChildNodes)
{
columns.Add(el.Attributes["name"].Value);
}
string columnList = String.Join(",", columns.ToArray());
return String.Format("SELECT {0} FROM {1}", columnList, tableName);
}
private void AddSummaryComment(CodeTypeMember member, string comment)
{
member.Comments.Add(new CodeCommentStatement("<summary>" + comment + "</summary>", true));
}
}
}
using System.Collections.Generic;
using System.Web.Compilation;
using System.CodeDom;
using System.Xml;
using System.IO;
using System.Web.Hosting;
namespace AspNetUnleashed
{
public class DataBuildProvider : BuildProvider
{
string _className;
public override void GenerateCode(AssemblyBuilder ab)
{
// Load the XML file
XmlDocument xmlData = new XmlDocument();
xmlData.Load(HostingEnvironment.MapPath(this.VirtualPath));
// Generate code from XML document
CodeCompileUnit dataCode = GetDataCode(xmlData);
// Add the code
ab.AddCodeCompileUnit(this, dataCode);
}
private CodeCompileUnit GetDataCode(XmlDocument xmlData)
{
// Add class
_className = Path.GetFileNameWithoutExtension(this.VirtualPath);
CodeTypeDeclaration dataType = new CodeTypeDeclaration(_className);
dataType.IsPartial = true;
// Add constructor
AddConstructor(dataType);
// Add properties
AddProperties(dataType, xmlData);
// Add Select method
AddSelect(dataType, xmlData);
// Add Select with conString overload
AddSelectConString(dataType, xmlData);
// Create namespace
CodeNamespace dataNS = new CodeNamespace("Data");
// Add class to namespace
dataNS.Types.Add(dataType);
// Create code unit
CodeCompileUnit dataCode = new CodeCompileUnit();
// Add namespace to code unit
dataCode.Namespaces.Add(dataNS);
// Add default namespaces
dataNS.Imports.Add(new CodeNamespaceImport("System"));
return dataCode;
}
private void AddConstructor(CodeTypeDeclaration dataType)
{
// Add default constructor method
CodeConstructor classConstructor = new CodeConstructor();
classConstructor.Attributes = MemberAttributes.Public;
dataType.Members.Add(classConstructor);
}
private void AddProperties(CodeTypeDeclaration dataType, XmlDocument xmlData)
{
foreach (XmlElement el in xmlData.DocumentElement.ChildNodes)
{
string propName = el.Attributes["name"].Value;
string propType = "System.String";
if (el.HasAttribute("type"))
propType = el.Attributes["type"].Value;
// Add backing field
string propFieldName = "_" + propName;
CodeMemberField field = new CodeMemberField(propType, propFieldName);
dataType.Members.Add(field);
// Add property
CodeMemberProperty prop = new CodeMemberProperty();
dataType.Members.Add(prop);
prop.Name = propName;
prop.Type = new CodeTypeReference(propType);
prop.Attributes = MemberAttributes.Public;
// Add Get
CodeMethodReturnStatement getMethod = new CodeMethodReturnStatement();
CodeFieldReferenceExpression refField = new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), propFieldName);
getMethod.Expression = refField;
prop.GetStatements.Add(getMethod);
// Add Set
CodeAssignStatement setMethod = new CodeAssignStatement(new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), propFieldName), new CodePropertySetValueReferenceExpression());
prop.SetStatements.Add(setMethod);
}
}
private void AddSelect(CodeTypeDeclaration dataType, XmlDocument xmlData)
{
// Create Select method
CodeMemberMethod selectMethod = new CodeMemberMethod();
selectMethod.Name = "Select";
selectMethod.Attributes = MemberAttributes.Static | MemberAttributes.Public;
selectMethod.Parameters.Add(new CodeParameterDeclarationExpression("System.Data.SqlClient.SqlConnection", "con"));
CodeVariableReferenceExpression refCon = new CodeVariableReferenceExpression("con");
AddSummaryComment(selectMethod, "Returns List of " + _className);
// Specify return type
CodeTypeReference refList = new CodeTypeReference("System.Collections.Generic.List", new CodeTypeReference[] { new CodeTypeReference(_className) });
selectMethod.ReturnType = refList;
// Add List collection for results
CodeVariableDeclarationStatement initResults = new CodeVariableDeclarationStatement(refList, "results", new CodeObjectCreateExpression(refList));
selectMethod.Statements.Add(initResults);
CodeVariableReferenceExpression refResults = new CodeVariableReferenceExpression("results");
// Add Command object
CodeVariableDeclarationStatement initCmd = new CodeVariableDeclarationStatement("System.Data.SqlClient.SqlCommand", "cmd", new CodeObjectCreateExpression("System.Data.SqlClient.SqlCommand"));
selectMethod.Statements.Add(initCmd);
CodeVariableReferenceExpression refCmd = new CodeVariableReferenceExpression("cmd");
CodeAssignStatement addCmdCon = new CodeAssignStatement(new CodePropertyReferenceExpression(refCmd, "Connection"), refCon);
selectMethod.Statements.Add(addCmdCon);
CodeVariableDeclarationStatement initCmdText = new CodeVariableDeclarationStatement(typeof(string), "cmdText", new CodePrimitiveExpression(GetCommandText(xmlData)));
selectMethod.Statements.Add(initCmdText);
CodeAssignStatement addCmdText = new CodeAssignStatement(new CodePropertyReferenceExpression(refCmd, "CommandText"), new CodeVariableReferenceExpression("cmdText"));
selectMethod.Statements.Add(addCmdText);
// Init SqlDataReader
CodeMethodInvokeExpression cmdExec = new CodeMethodInvokeExpression(refCmd, "ExecuteReader");
CodeVariableDeclarationStatement initReader = new CodeVariableDeclarationStatement("System.Data.SqlClient.SqlDataReader", "reader", cmdExec);
selectMethod.Statements.Add(initReader);
CodeVariableReferenceExpression refReader = new CodeVariableReferenceExpression("reader");
// Create While Loop
CodeVariableDeclarationStatement initCounter = new CodeVariableDeclarationStatement("System.Int32", "counter");
selectMethod.Statements.Add(initCounter);
CodeVariableReferenceExpression refLoopCounter = new CodeVariableReferenceExpression("counter");
CodeAssignStatement loopInit = new CodeAssignStatement(refLoopCounter, new CodePrimitiveExpression(0));
CodeMethodInvokeExpression loopTest = new CodeMethodInvokeExpression(refReader, "Read");
CodeAssignStatement loopIncrement = new CodeAssignStatement(refLoopCounter, new CodeBinaryOperatorExpression(refLoopCounter, CodeBinaryOperatorType.Add, new CodePrimitiveExpression(1)));
CodeIterationStatement loop = new CodeIterationStatement(loopInit, loopTest, loopIncrement);
selectMethod.Statements.Add(loop);
// Create object
CodeVariableDeclarationStatement initRecord = new CodeVariableDeclarationStatement(_className, "record", new CodeObjectCreateExpression(_className));
CodeVariableReferenceExpression refRecord = new CodeVariableReferenceExpression("record");
loop.Statements.Add(initRecord);
// Loop through properties
foreach (XmlElement el in xmlData.DocumentElement.ChildNodes)
{
string propName = el.Attributes["name"].Value;
string propType = "System.String";
if (el.HasAttribute("type"))
propType = el.Attributes["type"].Value;
CodeIndexerExpression refIndexer = new CodeIndexerExpression(refReader, new CodePrimitiveExpression(propName));
CodeCastExpression castIt = new CodeCastExpression(propType, refIndexer);
CodePropertyReferenceExpression refProp = new CodePropertyReferenceExpression(refRecord, propName);
CodeAssignStatement assignProp = new CodeAssignStatement(refProp, castIt);
loop.Statements.Add(assignProp);
}
// add record to collection
CodeMethodInvokeExpression invokeAdd = new CodeMethodInvokeExpression(refResults, "Add", new CodeExpression[] { refRecord });
loop.Statements.Add(invokeAdd);
// Return results
CodeMethodReturnStatement ret = new CodeMethodReturnStatement(refResults);
selectMethod.Statements.Add(ret);
// Add the Select method to the class
dataType.Members.Add(selectMethod);
}
private void AddSelectConString(CodeTypeDeclaration dataType, XmlDocument xmlData)
{
// Create Select method
CodeMemberMethod selectMethod = new CodeMemberMethod();
selectMethod.Name = "Select";
selectMethod.Attributes = MemberAttributes.Static | MemberAttributes.Public;
selectMethod.Parameters.Add(new CodeParameterDeclarationExpression("System.String", "connectionStringName"));
AddSummaryComment(selectMethod, "Returns List of " + _className);
CodeVariableReferenceExpression refConStringName = new CodeVariableReferenceExpression("connectionStringName");
// Specify return type
CodeTypeReference refList = new CodeTypeReference("System.Collections.Generic.List", new CodeTypeReference[] { new CodeTypeReference(_className) });
selectMethod.ReturnType = refList;
// Add List collection for results
CodeVariableDeclarationStatement initResults = new CodeVariableDeclarationStatement(refList, "results", new CodeObjectCreateExpression(refList));
selectMethod.Statements.Add(initResults);
CodeVariableReferenceExpression refResults = new CodeVariableReferenceExpression("results");
// Get connection string setting
CodeTypeReferenceExpression refConStrings = new CodeTypeReferenceExpression("System.Web.Configuration.WebConfigurationManager");
CodePropertyReferenceExpression refPropConStrings = new CodePropertyReferenceExpression(refConStrings, "ConnectionStrings");
CodeIndexerExpression conString = new CodeIndexerExpression(refPropConStrings, refConStringName);
CodeVariableDeclarationStatement initConStringSetting = new CodeVariableDeclarationStatement("System.Configuration.ConnectionStringSettings", "conStringSettings", conString);
selectMethod.Statements.Add(initConStringSetting);
CodeVariableReferenceExpression refConStringSettings = new CodeVariableReferenceExpression("conStringSettings");
// Get connection string
CodePropertyReferenceExpression refPropConString = new CodePropertyReferenceExpression(refConStringSettings, "ConnectionString");
CodeVariableDeclarationStatement initConString = new CodeVariableDeclarationStatement("System.String", "conString", refPropConString);
selectMethod.Statements.Add(initConString);
CodeVariableReferenceExpression refConString = new CodeVariableReferenceExpression("conString");
// Create connection object
CodeVariableDeclarationStatement initCon = new CodeVariableDeclarationStatement("System.Data.SqlClient.SqlConnection", "con", new CodeObjectCreateExpression("System.Data.SqlClient.SqlConnection"));
selectMethod.Statements.Add(initCon);
CodeVariableReferenceExpression refCon = new CodeVariableReferenceExpression("con");
// Assign connection string
CodeAssignStatement addConString = new CodeAssignStatement(new CodePropertyReferenceExpression(refCon, "ConnectionString"), refConString);
selectMethod.Statements.Add(addConString);
// Add Try
CodeTryCatchFinallyStatement tryBlock = new CodeTryCatchFinallyStatement();
selectMethod.Statements.Add(tryBlock);
// Open Connection
CodeMethodInvokeExpression conOpen = new CodeMethodInvokeExpression(refCon, "Open");
tryBlock.TryStatements.Add(conOpen);
// Call Select with connection
CodeTypeReferenceExpression refMe = new CodeTypeReferenceExpression(_className);
CodeMethodReferenceExpression refSelect = new CodeMethodReferenceExpression(refMe, "Select");
CodeMethodInvokeExpression invokeSelect = new CodeMethodInvokeExpression(refSelect, new CodeExpression[] { refCon });
// Assign results to local variable
CodeAssignStatement assignResults = new CodeAssignStatement(refResults, invokeSelect);
tryBlock.TryStatements.Add(assignResults);
// Close Connection
CodeMethodInvokeExpression conClose = new CodeMethodInvokeExpression(refCon, "Close");
tryBlock.FinallyStatements.Add(conClose);
// Return results
CodeMethodReturnStatement ret = new CodeMethodReturnStatement(refResults);
selectMethod.Statements.Add(ret);
// Add the Select method to the class
dataType.Members.Add(selectMethod);
}
private string GetCommandText(XmlDocument xmlData)
{
string tableName = xmlData.DocumentElement.Name;
List<String> columns = new List<String>();
foreach (XmlElement el in xmlData.DocumentElement.ChildNodes)
{
columns.Add(el.Attributes["name"].Value);
}
string columnList = String.Join(",", columns.ToArray());
return String.Format("SELECT {0} FROM {1}", columnList, tableName);
}
private void AddSummaryComment(CodeTypeMember member, string comment)
{
member.Comments.Add(new CodeCommentStatement("<summary>" + comment + "</summary>", true));
}
}
}
<system.web>
<compilation debug="true">
<codeSubDirectories>
<add directoryName="CustomBuildProviders"/>
</codeSubDirectories>
<buildProviders>
<add extension=".simple" type="AspNetUnleashed.SimpleBuildProvider"/>
<add extension=".data" type="AspNetUnleashed.DataBuildProvider"/>
</buildProviders>
<expressionBuilders>
<add expressionPrefix="lookup" type="AspNetUnleashed.LookupExpressionBuilder"/>
</expressionBuilders>
<assemblies>
<add assembly="System.Core, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add assembly="System.Xml.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
<add assembly="System.Data.DataSetExtensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
</assemblies>
</compilation> ExpressionBuilder:从一个表达式生成另外一个表达式
using System.Web.Compilation;
public class LookupExpressionBuilder : ExpressionBuilder
public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
public override object EvaluateExpression(object target, BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
public override bool SupportsEvaluate
<?xml version="1.0"?>
<lookup>
<add key="WelcomeMessage" value="Welcome to our Web site!" />
<add key="Copyright" value="All content copyrighted by the company." />
</lookup> <%$ lookup:WelcomeMessage %>
示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
using System;
using System.CodeDom;
using System.Web.UI;
using System.ComponentModel;
using System.Web.Compilation;
using System.Xml;
using System.Web.Hosting;
using System.Web.Caching;
namespace AspNetUnleashed
{
public class LookupExpressionBuilder : ExpressionBuilder
{
public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
{
CodeTypeReferenceExpression refMe = new CodeTypeReferenceExpression(base.GetType());
CodePrimitiveExpression expression = new CodePrimitiveExpression(entry.Expression);
return new CodeMethodInvokeExpression(refMe, "GetEvalData", new CodeExpression[] { expression });
}
public override object EvaluateExpression(object target, BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
{
return GetEvalData(entry.Expression);
}
public override bool SupportsEvaluate
{
get
{
return true;
}
}
public static string GetEvalData(string expression)
{
XmlDocument lookupDoc = (XmlDocument)HostingEnvironment.Cache["Lookup"];
if (lookupDoc == null)
{
lookupDoc = new XmlDocument();
string lookupFileName = HostingEnvironment.MapPath("~/Lookup.config");
lookupDoc.Load(lookupFileName);
CacheDependency fileDepend = new CacheDependency(lookupFileName);
HostingEnvironment.Cache.Insert("Lookup", lookupDoc, fileDepend);
}
string search = String.Format("//add[@key='{0}']", expression);
XmlNode match = lookupDoc.SelectSingleNode(search);
if (match != null)
return match.Attributes["value"].Value;
return "[no match]";
}
}
}
using System.CodeDom;
using System.Web.UI;
using System.ComponentModel;
using System.Web.Compilation;
using System.Xml;
using System.Web.Hosting;
using System.Web.Caching;
namespace AspNetUnleashed
{
public class LookupExpressionBuilder : ExpressionBuilder
{
public override CodeExpression GetCodeExpression(BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
{
CodeTypeReferenceExpression refMe = new CodeTypeReferenceExpression(base.GetType());
CodePrimitiveExpression expression = new CodePrimitiveExpression(entry.Expression);
return new CodeMethodInvokeExpression(refMe, "GetEvalData", new CodeExpression[] { expression });
}
public override object EvaluateExpression(object target, BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context)
{
return GetEvalData(entry.Expression);
}
public override bool SupportsEvaluate
{
get
{
return true;
}
}
public static string GetEvalData(string expression)
{
XmlDocument lookupDoc = (XmlDocument)HostingEnvironment.Cache["Lookup"];
if (lookupDoc == null)
{
lookupDoc = new XmlDocument();
string lookupFileName = HostingEnvironment.MapPath("~/Lookup.config");
lookupDoc.Load(lookupFileName);
CacheDependency fileDepend = new CacheDependency(lookupFileName);
HostingEnvironment.Cache.Insert("Lookup", lookupDoc, fileDepend);
}
string search = String.Format("//add[@key='{0}']", expression);
XmlNode match = lookupDoc.SelectSingleNode(search);
if (match != null)
return match.Attributes["value"].Value;
return "[no match]";
}
}
}
HTTP处理程序:
public interface IHttpHandler
{
bool IsReusable { get; }
void ProcessRequest(HttpContext context);
<httpHandlers>
<add path="*.gif" verb="*" type="AspNetUnleashed.ImageHandler" validate="false"/>
<add path="*.jpeg" verb="*" type="AspNetUnleashed.ImageHandler" validate="false"/>
<add path="*.jpg" verb="*" type="AspNetUnleashed.ImageHandler" validate="false"/>
<add path="*.rss" verb="*" type="AspNetUnleashed.RSSHandler" validate="false"/>
<remove verb="*" path="*.asmx"/>
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add verb="GET,HEAD" path="ScriptResource.axd" validate="false" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
</httpHandlers> path:关联路径
verb:动作:get or post
type:处理程序
vaildate:处理程序是否在应用程序启动时载入
异步HTTP处理程序:
public interface IHttpAsyncHandler : IHttpHandler
{
IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData);
void EndProcessRequest(IAsyncResult result);
获取应用程序属性:this.ApplicationInstance.NumberOfRequests
public int NumberOfRequests
{
get {...}
} 示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
<%@ Application Language="C#" %>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Web.Configuration" %>
<script runat="server">
private string _conString;
private SqlConnection _con;
private SqlCommand _cmdSelect;
private SqlCommand _cmdInsert;
public override void Init()
{
// initialize connection
_conString = WebConfigurationManager.ConnectionStrings["Log"].ConnectionString;
_con = new SqlConnection(_conString);
// initialize select command
_cmdSelect = new SqlCommand("SELECT COUNT(*) FROM Log WHERE Path=@Path", _con);
_cmdSelect.Parameters.Add("@Path", SqlDbType.NVarChar, 500);
// initialize insert command
_cmdInsert = new SqlCommand("INSERT Log (Path) VALUES (@Path)", _con);
_cmdInsert.Parameters.Add("@Path", SqlDbType.NVarChar, 500);
}
public int NumberOfRequests
{
get
{
int result = 0;
_cmdSelect.Parameters["@Path"].Value = Request.AppRelativeCurrentExecutionFilePath;
try
{
_con.Open();
result = (int)_cmdSelect.ExecuteScalar();
}
finally
{
_con.Close();
}
return result;
}
}
void Application_BeginRequest(object sender, EventArgs e)
{
// Record new request
_cmdInsert.Parameters["@Path"].Value = Request.AppRelativeCurrentExecutionFilePath;
try
{
_con.Open();
_cmdInsert.ExecuteNonQuery();
}
finally
{
_con.Close();
}
}
</script>
<%@ Import Namespace="System.Data" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Web.Configuration" %>
<script runat="server">
private string _conString;
private SqlConnection _con;
private SqlCommand _cmdSelect;
private SqlCommand _cmdInsert;
public override void Init()
{
// initialize connection
_conString = WebConfigurationManager.ConnectionStrings["Log"].ConnectionString;
_con = new SqlConnection(_conString);
// initialize select command
_cmdSelect = new SqlCommand("SELECT COUNT(*) FROM Log WHERE Path=@Path", _con);
_cmdSelect.Parameters.Add("@Path", SqlDbType.NVarChar, 500);
// initialize insert command
_cmdInsert = new SqlCommand("INSERT Log (Path) VALUES (@Path)", _con);
_cmdInsert.Parameters.Add("@Path", SqlDbType.NVarChar, 500);
}
public int NumberOfRequests
{
get
{
int result = 0;
_cmdSelect.Parameters["@Path"].Value = Request.AppRelativeCurrentExecutionFilePath;
try
{
_con.Open();
result = (int)_cmdSelect.ExecuteScalar();
}
finally
{
_con.Close();
}
return result;
}
}
void Application_BeginRequest(object sender, EventArgs e)
{
// Record new request
_cmdInsert.Parameters["@Path"].Value = Request.AppRelativeCurrentExecutionFilePath;
try
{
_con.Open();
_cmdInsert.ExecuteNonQuery();
}
finally
{
_con.Close();
}
}
</script>
HttpModule:在每次请求页面时发生,可处理HttpApplication事件
public interface IHttpModule
{
void Dispose();
void Init(HttpApplication context);
public void Init(HttpApplication app)
{
app.AuthorizeRequest += new EventHandler(AuthorizeRequest);
} <httpModules>
<add name="QueryStringModule" type="AspNetUnleashed.QueryStringModule"/>
</httpModules> 示例代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
public class QueryStringAuthenticationModule : IHttpModule
{
public void Init(HttpApplication app)
{
app.AuthorizeRequest += new EventHandler(AuthorizeRequest);
}
private void AuthorizeRequest(Object sender, EventArgs e)
{
// Get context
HttpApplication app = (HttpApplication)sender;
HttpContext context = app.Context;
// If the request is for Login.aspx, exit
string path = context.Request.AppRelativeCurrentExecutionFilePath;
if (String.Compare(path, "~/login.aspx", true) == 0)
return;
// Check for password
bool authenticated = false;
if (context.Request.QueryString["password"] != null)
{
if (context.Request.QueryString["password"] == "secret")
authenticated = true;
}
// If not authenticated, redirect to login.aspx
if (!authenticated)
context.Response.Redirect("~/Login.aspx");
}
public void Dispose() { }
}
{
public void Init(HttpApplication app)
{
app.AuthorizeRequest += new EventHandler(AuthorizeRequest);
}
private void AuthorizeRequest(Object sender, EventArgs e)
{
// Get context
HttpApplication app = (HttpApplication)sender;
HttpContext context = app.Context;
// If the request is for Login.aspx, exit
string path = context.Request.AppRelativeCurrentExecutionFilePath;
if (String.Compare(path, "~/login.aspx", true) == 0)
return;
// Check for password
bool authenticated = false;
if (context.Request.QueryString["password"] != null)
{
if (context.Request.QueryString["password"] == "secret")
authenticated = true;
}
// If not authenticated, redirect to login.aspx
if (!authenticated)
context.Response.Redirect("~/Login.aspx");
}
public void Dispose() { }
}