[英]ASP Repeater Previous Item's DataItem in ItemDataBound is null
[英]decrypt in repeater item using itemdatabound
我正在使用ASP中繼器顯示圖像,我希望對其進行加密,但是我不知道每次中繼器發射物品時如何解密
//client side <asp:Repeater ID="Repeater1" runat="server" OnItemCommand="Repeater1_ItemCommand" OnItemDataBound="Repeater1_ItemDataBound" >
`//server side
//decrypt method
private void DecryptFile(string inputFile, string outputFile)
{
{
string password = @"myKey123"; // Your Key Here
UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = UE.GetBytes(password);
FileStream fsCrypt = new FileStream(inputFile, FileMode.Open);
RijndaelManaged RMCrypto = new RijndaelManaged();
CryptoStream cs = new CryptoStream(fsCrypt,
RMCrypto.CreateDecryptor(key, key),
CryptoStreamMode.Read);
FileStream fsOut = new FileStream(outputFile, FileMode.Create);
int data;
while ((data = cs.ReadByte()) != -1)
fsOut.WriteByte((byte)data);
fsOut.Close();
cs.Close();
fsCrypt.Close();
}
}
`
protected void Repeater1_ItemDataBound(object source, RepeaterCommandEventArgs e)
{
if (e.CommandName =="openimage")
{
string[] commandArgs = e.CommandArgument.ToString().Split(new char[] { ',' });
DecryptFile(commandArgs[0], commandArgs[0]);
}
}
當我嘗試運行它時,它給了我錯誤CS0123:'Repeater1_ItemDataBound'沒有重載匹配委托'System.Web.UI.WebControls.RepeaterItemEventHandler'
請幫助我,因為我是C#新手
您的事件處理程序上的方法簽名不正確。 您需要將RepeaterCommandEventArgs更改為RepeaterItemEventArgs 。
protected void Repeater1_ItemDataBound(object source, RepeaterItemEventArgs e)
{
}
這樣可以解決您的錯誤,但是對於您要嘗試執行的操作,我不確定這是否是顯示解密圖像的好方法。 我建議創建一個通用處理程序,該處理程序將通過傳入ID即時解密您的圖像,一旦傳遞ID,您就可以解密並寫到屏幕上。
public class DisplayImage : IHttpHandler
{
/// <summary>
/// Enables processing of HTTP Web requests by a custom HttpHandler that implements the <see cref="T:System.Web.IHttpHandler" /> interface.
/// </summary>
/// <param name="context">An <see cref="T:System.Web.HttpContext" /> object that provides references to the intrinsic server objects (for example, Request, Response, Session, and Server) used to service HTTP requests.</param>
public void ProcessRequest(HttpContext context)
{
if (!this.HasAccess())
{
context.Response.End();
return;
}
string requestFileName = context.Request.QueryString["FileName"];
DecryptFile(requestFileName, context);
}
/// <summary>
/// Gets a value indicating whether another request can use the <see cref="T:System.Web.IHttpHandler" /> instance.
/// </summary>
/// <value><c>true</c> if this instance is reusable; otherwise, <c>false</c>.</value>
/// <returns>true if the <see cref="T:System.Web.IHttpHandler" /> instance is reusable; otherwise, false.</returns>
public bool IsReusable
{
get
{
return false;
}
}
/// <summary>
/// Determines whether the user has access to display an image.
/// </summary>
/// <returns><c>true</c> if this instance has access; otherwise, <c>false</c>.</returns>
private bool HasAccess()
{
// Check if user is logged in and has permissions
// to do the decryption
// use your own logic here
return true;
}
/// <summary>
/// Decrypts the file and outputs to the response buffer
/// </summary>
/// <param name="inputFile">The input file.</param>
/// <param name="context">The context.</param>
private void DecryptFile(string inputFile, HttpContext context)
{
if (PathTraversalCheck(inputFile))
{
context.Response.End();
return;
}
// get the base directory
inputFile = Path.Combine(ConfigurationManager.AppSettings["filedirectory"], inputFile);
if (!File.Exists())
{
context.Response.End();
return;
}
string password = @"myKey123"; // Your Key Here
UnicodeEncoding UE = new UnicodeEncoding();
byte[] key = UE.GetBytes(password);
using (FileStream encryptedFile = new FileStream(inputFile, FileMode.Open))
{
RijndaelManaged rijndael = new RijndaelManaged();
using (MemoryStream output = new MemoryStream())
{
using (CryptoStream cryptoStream = new CryptoStream(encryptedFile, rijndael.CreateDecryptor(key, key), CryptoStreamMode.Read))
{
// write to the memory stream
var buffer = new byte[1024];
var read = cryptoStream.Read(buffer, 0, buffer.Length);
while (read > 0)
{
output.Write(buffer, 0, read);
read = cryptoStream.Read(buffer, 0, buffer.Length);
}
cryptoStream.Flush();
// output to the response buffer
context.Response.ContentType = "image/jpeg";
context.Response.BinaryWrite(output.ToArray());
}
}
}
}
/// <summary>
/// Checks for a path traversal attack
/// </summary>
/// <param name="inputFile">The input file.</param>
/// <returns>System.String.</returns>
private bool PathTraversalCheck(string inputFile)
{
if (inputFile.Contains(".") || inputFile.Contains('\\') || inputFile.Contains('/'))
{
return true;
}
return false;
}
}
在轉發器中,您只需要將src設置為img的img標簽放置到處理程序中即可。
<ItemTemplate>
<img src="DisplayImage.ashx?FIleName=<%# DataBinder.Eval(Container.DataItem, "FileName" )%>" />
</ItemTemplate>
我還需要更改的其他地方是,我不會將密鑰存儲在源代碼中,而通過對dll進行反編譯很容易讀取。 相反,您應該將其存儲在web.config中並加密web.config。 請查看http://msdn.microsoft.com/library/dtkwfdky.aspx以獲取說明。
您需要更正中繼器事件:
void Repeater1_ItemDataBound(Object Sender, RepeaterItemEventArgs e) {
}
另外,要處理轉發器中的事件,應將代碼移至Repeater1__ItemCommand事件。
void Repeater1__ItemCommand(Object Sender, RepeaterCommandEventArgs e) {
if (e.CommandName =="openimage")
{
string[] commandArgs = e.CommandArgument.ToString().Split(new char[] { ',' });
DecryptFile(commandArgs[0], commandArgs[0]);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.