【知识碎片】Net项目经验积累
后台传JSON到js报错
MVC控制器传json到前端JS"变为" 导致JS报错
重点是一定要在@ViewBag.typeJson两边加双引号,并且后台用
编码前台解码
ViewBag.typeJson=System.Web.HttpUtility.UrlEncode(JsonConvert.SerializeObject(info));
var data =eval('(' + decodeURIComponent( "@ViewBag.typeJson") + ')');
响应报文 隐藏服务器信息
选择你需要修改的站点并双击HTTP响应头部分
所有的自定义HTTP头全在这里了,删除相应的头仅需要点击右边的”Remove”
在代码中实现的
HttpContext.Response.Headers.Remove("X-AspNet-Version");
HttpContext.Response.Headers.Remove("X-AspNetMvc-Version");
HttpContext.Response.Headers.Set("Server", "Nginx-57blog-VIP");
在webconfig中实现的
MVC的版本信息
<httpRuntime enableVersionHeader="false" />
在wencongig中加这个就可以了
URL重写方案总结
数据库设计
1、表的设计合理(三范式)
2、添加合适的索引
3、分表技术(水平分割、垂直分割
4、定时清除垃圾数据、定时进行碎片整理
5、多用存储过程、触发器
6、读写分离
良好的数据库: 介绍存储空间 保证数据完整性 糟糕的:数据冗(rong)余 不完整数据
分库解决方案
自己设定一定的规则 比如hash 或者取膜
比如ID 单数设定一个连接字符串 双数设定一个连接字符串
或者根据ID的位数 或者根据拼音 汉字笔画字符长度等
当ID时单数的时候 存的时候存到1库 取得时候又计算ID等于单数的时候去1库取
如果是获取列表页没有问题 用户ID为3的文章文章都存在库1上获取的时候 不需要获取所有用户的文章
网站架构演变:单主机-缓存服务器-页面缓存-服务器集群-数据库分库--分布式数据库
负载均衡
硬件Netscaler F5 Radware Array
软件 LVS nginx apache tengine(淘宝的,提交给nginx nginx不接受,就自己写了)
LVS:http://www.cnblogs.com/edisonchou/p/4281978.html
搭建主机 :
需要安装一个软件 keepalived
故障移除 把服务器关掉一个,在转发的时候就不转发到这台机器
故障恢复 启动后,又开始转发
主机挂了 备机接管主机的工作
通过心跳检查检测主机是否挂了
nginx 反向代理服务器 异步非阻塞式 官方高并发5W 实际生产2-3W
管道事件
第一个事件 beginrequrest 第七个第八个之间 根据文件扩展名判断是一般处理程序还是页面程序,如果是ashx就创建httphandler实例 如果是aspx就创建Page对象(每次请求都会有一个IhttpHandler对象去处理当前请求)
在第七个事件之前如果指定了handler 在第七第八个事件之间就创建指定的handler
1-7之间如果指定当前请求处理程序,7-8就不会创建
11-12 执行刚刚创建的IhhttpHandler.processrequest() 如果是page 执行声明周期
Page类回调技术 单页模式
在前台页面直接写一个 protected void Page_Load(obeject obj,Event e) 就不需要后台页面了 可以直接删除了,要放在 <script runat="server"></script> 内
这里面也可以写其他函数 不过还是写在后台效率高,直接编译dl了,aspx是动态编译效率低
<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="gb2312" %>
<%@ Implements Interface="System.Web.UI.ICallbackEventHandler" %>
<%@ Import Namespace="System.Text" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>用户注册</title>
<script language="javascript">
//客户端执行的方法
//下面的方法是接收并处理服务器方法执行的返回结果
function Success(args, context)
{
message.innerText = args;
}
//下面的方式是当接收服务器方法处理的结果发生异常时调用的方法
function Error(args, context)
{
message.innerText = '发生了异常';
}
</script>
<script language="c#" runat="server">
string result="";
// 定义在服务器端运行的回调方法.
public void RaiseCallbackEvent(String eventArgument)
{
if(eventArgument.ToLower().IndexOf("admin")!=-1)
{
result=eventArgument+"不能作为用户名注册。";
}
else
{
result=eventArgument+"可以注册。";
}
//throw new Exception();
}
//定义返回回调方法执行结果的方法
public string GetCallbackResult()
{
return result;
}
//服务器上执行的方法
public void Page_Load(Object sender,EventArgs e)
{
// 获取当前页的ClientScriptManager的引用
ClientScriptManager csm = Page.ClientScript;
// 获取回调引用。会在客户端生成WebForm_DoCallback方法,调用它来达到异步调用。这个方式是微软写的方法,会被发送到客户端
//注意这里的"Success"和"Error"两个字符串分别客户端代码中定义的两个javascript函数
//下面的方法最后一个参数的意义:true表示执行异步回调,false表示执行同步回调
String reference = csm.GetCallbackEventReference(this, "args","Success","","Error",false);
String callbackScript = "function CallServerMethod(args, context) {/n" +
reference + ";/n }";
// 向当前页面注册javascript脚本代码
csm.RegisterClientScriptBlock(this.GetType(), "CallServerMethod",
callbackScript, true);
}
</script>
</head>
<body>
<form id="form1" runat="server">
<table border="1" cellpadding="0" cellspacing="0" width="400px">
<tr>
<td width="100px">用户名</td><td><input type="text" size="10" maxlength="20" id="txtUserName" onblur="CallServerMethod(txtUserName.value,null)" /><span id="message"></span></td>
</tr>
<tr>
<td>密码</td><td><input type="password" size="10" maxlength="20" id="txtPwd" /></td>
</tr>
</table>
</form>
</body>
</html>
通过一个aspx文件直接获取服务器web.config文件
<%@ Page Language="C#" ContentType="text/html" ResponseEncoding="gb2312" %> <%@ Import Namespace="System.Text" %>
<%@ Import Namespace="System.IO"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>用户注册</title>
<script language="javascript"> </script>
<script language="c#" runat="server">
string result=""; //服务器上执行的方法
public void Page_Load(Object sender,EventArgs e)
{
using (FileStream fs = new FileStream(Server.MapPath("/")+"Web.config", FileMode.Open, FileAccess.Read))
{
byte[] buffer = new byte[fs.Length];
fs.Read(buffer, 0, buffer.Length);
string msg = System.Text.Encoding.UTF8.GetString(buffer);
//Response.Write(msg); string timeNow = DateTime.Now.ToString();
Response.Clear();
Response.Buffer = false;
Response.ContentType = "application/octet-stream";
Response.AppendHeader("content-disposition", "attachment;filename=" + "Web" + ".config;"); Response.Write(msg);
Response.Flush();
Response.End();
}
}
</script>
</head>
<body> </body>
</html>
系统Host
host 地址C:\Windows\System32\drivers\etc
刷新缓存命令:
cmd ipconfig /flushdns
多个域名绑定一个IP
127.0.0.1 localhost www.57blog.com xiaoshi57.57blog.com #多个用空格隔开即可
QQ登录
张善友博客 http://www.cnblogs.com/shanyou/archive/2012/02/05/2338797.html
NVelocity 视图模板引擎
NVelocity 视图模板引擎 如 razor vtemplate
CDN加速
全国各地布服务器 把资源放到每个服务器上,就叫CDN加速
API认证原理
api认证 想到就记下来了
用一个md5、hash或者其他的加密算法
这个秘钥由以下部分组成:
tiame: 时间(动态的就行可以不是时间(guid))
key: 随意写一个盐就可以,这个盐不能传输,客户端和服务端之后即可
其他的就无所谓了
然后加一起生成MD5,把这个MD5传给服务端 服务端把客户端传来的时间加上盐然后计算出MD5和你传来的MD5值对比,即可
订单存储过程
存储过程比放在程序里的SQL速度快
存储过程只编译一次 程序里的每次请求都需要编译
安全 不会有SQL注入
缺点 可移植性差
互联网项目一般不用存储过程
create proc createOrder
@address nvarchar(255),--收货人地址
@orderId nvarchar(50),--订单号
@userId int,--用户编号
@totalMoney money output --总金额
as
begin
declare @error int
set @error=0
begin transaction
---计算总金额
select @totalMoney=sum([Count]*UnitPrice)from Cart inner join Books on Cart.BookId=Books.Id where Cart.UserId=@userId
set @error=@@error+@error
--向订单主表中插入数据。
insert into dbo.Orders(OrderId, OrderDate, UserId, TotalPrice, PostAddress, state) values(@orderId,getdate(),@userId,@totalMoney,@address,0)
set @error=@@error+@error
--行订单明细表中插入数据
insert into dbo.OrderBook(OrderID, BookID, Quantity, UnitPrice) select @orderId,Cart.BookId,Cart.Count,Books.UnitPrice from Cart inner join Books on Cart.BookId=Books.Id where Cart.UserId=@userId
set @error=@@error+@error
--删除购物车表中的数据
delete from Cart where UserId=@userId
set @error=@@error+@error
if @error>0
begin
rollback transaction--回滚
end
else
begin
commit transaction--提交
end
end
正则过滤禁用词
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks; namespace BookShop.BLL
{
public class Articel_WordsManager
{
DAL.Articel_WordsService dal = new DAL.Articel_WordsService();
public bool Insert(Model.Articel_Words model)
{
return dal.Insert(model)>;
}
/// <summary>
/// 判断用户的评论中是否有禁用词
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public bool CheckForbid(string msg)
{
List<string> list = dal.GetForbidWord();//获取所有的禁用词 放入缓存中。
string regex = string.Join("|",list.ToArray());//aa|bb|cc|
return Regex.IsMatch(msg, regex);
//foreach (string word in list)
//{
// msg.Contains(word);
// break;
//} }
/// <summary>
/// 审查词过滤
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public bool CheckMod(string msg)
{ List<string> list = dal.GetModWord();//获取所有的审查词,放入缓存中。
string regex = string.Join("|", list.ToArray());//aa|bb|cc|
regex = regex.Replace(@"\", @"\\").Replace("{2}",@".{0,2}");
return Regex.IsMatch(msg, regex);
}
/// <summary>
/// 替换词过滤
/// </summary>
/// <param name="msg"></param>
/// <returns></returns>
public string CheckReplace(string msg)
{
List<Model.Articel_Words> list = dal.GetReplaceWord();//放入缓存中。
foreach (Model.Articel_Words model in list)
{
msg = msg.Replace(model.WordPattern, model.ReplaceWord);
}
return msg;
}
}
}
生成静态页面
/// <summary>
/// 将商品的信息生成静态页面
/// </summary>
public void CreateHtmlPage(int id)
{
Model.Book model=dal.GetModel(id);
//获取模板文件
string template = HttpContext.Current.Request.MapPath("/Template/BookTemplate.html");
string fileContent = File.ReadAllText(template);
fileContent = fileContent.Replace("$title", model.Title).Replace("$author", model.Author).Replace("$unitprice",model.UnitPrice.ToString("0.00")).Replace("$isbn",model.ISBN).Replace("$content",model.ContentDescription).Replace("$bookId",model.Id.ToString());
string dir = "/HtmlPage/" + model.PublishDate.Year + "/" + model.PublishDate.Month + "/" + model.PublishDate.Day + "/";
Directory.CreateDirectory(Path.GetDirectoryName(HttpContext.Current.Request.MapPath(dir)));
string fullDir = dir + model.Id + ".html";
File.WriteAllText(HttpContext.Current.Request.MapPath(fullDir), fileContent, System.Text.Encoding.UTF8); }
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head> <title>$title</title>
<meta content="北京市新华书店王府井书店,致力于提供专业化购书服务.网上购书选择新华书店王府井书店(网上书店),购书放心有保障.王府井书店电话:010-65132842.010-65252592" name="description"/>
<meta content="王府井书店 新华书店 网上书店 网上购书 北京图书大厦" name="keywords"/> <link href="/Css/tableStyle.css" rel="stylesheet" /><!--在模板文件中引用外部文件时一定要使用绝对路径-->
<link href="/Css/index.css" rel="stylesheet" />
<script src="/js/jquery-1.7.1.js"></script>
<script src="/ckeditor/ckeditor.js"></script>
<style type="text/css"> .itcast_comments{ width:620px;color: #333;font: normal 12px/24px Helvetica, Tahoma, Arial, sans-serif; font-size:14px;}
.reply_btn{ font-size:14px; background:#cc0000; padding:8px 15px; border:none; color:#fff; cursor: pointer; font:"Microsoft YaHei"; font-weight:bold;}
.reply_box{border:1px solid #CCC; font-size:14px;}
</style>
<script type="text/javascript">
$(function () {
$("#btnAdd").click(function () {
addComment();
});
loadComment();//加载评论
loadUBBCode();//加载UBB编辑器
});
//加载UBB编辑器
function loadUBBCode() {
CKEDITOR.replace('txtContent',
{
extraPlugins: 'bbcode',
removePlugins: 'bidi,button,dialogadvtab,div,filebrowser,flash,format,forms,horizontalrule,iframe,indent,justify,liststyle,pagebreak,showborders,stylescombo,table,tabletools,templates',
toolbar:
[
['Source', '-', 'Save', 'NewPage', '-', 'Undo', 'Redo'],
['Find', 'Replace', '-', 'SelectAll', 'RemoveFormat'],
['Link', 'Unlink', 'Image'],
'/',
['FontSize', 'Bold', 'Italic', 'Underline'],
['NumberedList', 'BulletedList', '-', 'Blockquote'],
['TextColor', '-', 'Smiley', 'SpecialChar', '-', 'Maximize']
],
smiley_images:
[
'regular_smile.gif', 'sad_smile.gif', 'wink_smile.gif', 'teeth_smile.gif', 'tounge_smile.gif',
'embaressed_smile.gif', 'omg_smile.gif', 'whatchutalkingabout_smile.gif', 'angel_smile.gif', 'shades_smile.gif',
'cry_smile.gif', 'kiss.gif'
],
smiley_descriptions:
[
'smiley', 'sad', 'wink', 'laugh', 'cheeky', 'blush', 'surprise',
'indecision', 'angel', 'cool', 'crying', 'kiss'
]
});
} //加载评论
function loadComment() {
$.post("/ashx/BookComment.ashx", { "action": "load", "bookId": $bookId }, function (data) {
var serverData = $.parseJSON(data);
var serverDataLength = serverData.length;
for (var i = 0; i < serverDataLength; i++) {
$("<li>" + serverData[i].CreateDateTime + ":" + serverData[i].Msg + "</li>").appendTo("#commentList");
}
});
}
//添加评论
function addComment() {
//var msg = $("#txtContent").val();
var oEditor = CKEDITOR.instances.txtContent;//找到UBB编辑器
var msg = oEditor.getData();//获取编辑器内容
if (msg != "") {
$.post("/ashx/BookComment.ashx", { "action": "add", "msg": msg, "bookId": $bookId }, function (data) {
var serverData = data.split(':');
if (serverData[0] == "ok") {
// $("#txtContent").val("");
oEditor.setData("");
$("#txtContent").focus();
loadComment();
$("#txtMsg").text(serverData[1]);
} else {
$("#txtMsg").text(serverData[1]);
} });
} else {
$("#txtMsg").text("评论内容不能为空!!");
$("#txtContent").focus();
}
}
</script>
</head>
<body>
<center>
<div class="top">
<div class="m_c" style="width: 736px; height: 27px">
<span class="l">
<a href="http://www.beifabook.com" target="_blank">北发图书网主网站</a> |
<a href="http://www.bjbb.com" target="_blank">北京图书大厦</a> |
<a href="../default.aspx" target="_blank"><font color="#00A0E9">王府井书店</font></a> |
<a href="http://www.zgcbb.com/" target="_blank">中关村图书大厦</a> |
<a href="http://www.yycbook.com/" target="_blank">亚运村图书大厦</a> |
<a href="http://www.hs-book.com" target="_blank">花市书店</a> |
<a href="/OrderInfo.aspx" >我的订单</a></span></div></div> <div style="WIDTH: 750px; text-align: left;"><img src="/images/集团网站1.jpg" width="780" height="93" /><br />
</div>
</center> <table>
<tr><td>书名</td><td>$title</td></tr>
<tr><td>作者</td><td>$author</td></tr>
<tr><td>单价</td><td>$unitprice</td></tr>
<tr><td>封面</td><td><img src="/Images/BookCovers/$isbn.jpg" /></td></tr>
<tr><td>简介</td><td>$content</td></tr>
</table>
<hr />
<ul id="commentList" class="itcast_comments"> </ul>
<textarea id="txtContent" rows="20" cols="100" class="reply_box" placeholder="有什么感想?来说说!!"></textarea><br />
<input type="button" value="发布评论" id="btnAdd" class="reply_btn" /><span id="txtMsg" style="font-size:14px;color:red"></span>
<div id="footer">
<table border="0" width="100%" class="categories1">
<tr>
<td align="center">
<ul>
<li><a href='#'>关于我们王府井书店</li>
<li><a href="#">书店营业时间:9:30-21:00 </a> </li>
<li> <a href="#"; target=_blank; ><img src="/images/logo123x40.jpg" width="123" height="40" border="0"></a> <a href="#"; target=_blank; ><img border="0" src="/Images/kaixin.jpg"></a> </li>
<li> <span lang="zh-cn"><a title="京ICP备08001692号" href="http://www.miibeian.gov.cn">京ICP备08987373号</a></span> </li>
</ul></td>
</tr>
</table>
</div> </body>
</html>
发送邮件 找回密码
/// <summary>
/// 找回用户的密码
/// </summary>
/// <param name="userInfo"></param>
public void FindUserPwd(Model.User userInfo)
{
BLL.SettingsManager bll = new SettingsManager();
//系统产生一个新的密码,然后更新数据库,再将新的密码发送到用户的邮箱中。
string newPwd = Guid.NewGuid().ToString().Substring(,);
userInfo.LoginPwd = newPwd;//一定要将系统产生的新密码加密以后更新到数据库中,但是发送到用户邮箱中的密码必须是明文的。
dal.Update(userInfo);
MailMessage mailMsg = new MailMessage();//两个类,别混了,要引入System.Net这个Assembly
mailMsg.From = new MailAddress(bll.GetValue("系统邮件地址"));//源邮件地址
mailMsg.To.Add(new MailAddress(userInfo.Mail));//目的邮件地址。可以有多个收件人
mailMsg.Subject = "在商城网站中的新的账户";//发送邮件的标题
StringBuilder sb = new StringBuilder();
sb.Append("用户名是:"+userInfo.LoginId);
sb.Append("新密码是:"+newPwd);
mailMsg.Body =sb.ToString();//发送邮件的内容
//mailMsg.IsBodyHtml = true;
SmtpClient client = new SmtpClient(bll.GetValue("系统邮件SMTP"));//smtp.163.com,smtp.qq.com
client.Credentials = new NetworkCredential(bll.GetValue("系统邮件用户名"), bll.GetValue("系统邮件密码"));
client.Send(mailMsg);//注意:发送大量邮件时阻塞,所以可以将要发送的邮件先发送到队列中。 }
.Net自带缓存helper
using System;
using System.Web;
using System.Collections; public class CookiesHelper
{
/**//// <summary>
/// 获取数据缓存
/// </summary>
/// <param name="CacheKey">键</param>
public static object GetCache(string CacheKey)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
return objCache[CacheKey];
} /**//// <summary>
/// 设置数据缓存
/// </summary>
public static void SetCache(string CacheKey, object objObject)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Insert(CacheKey, objObject);
} /**//// <summary>
/// 设置数据缓存
/// </summary>
public static void SetCache(string CacheKey, object objObject, TimeSpan Timeout)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Insert(CacheKey, objObject, null, DateTime.MaxValue, Timeout, System.Web.Caching.CacheItemPriority.NotRemovable, null);
} /**//// <summary>
/// 设置数据缓存
/// </summary>
public static void SetCache(string CacheKey, object objObject, DateTime absoluteExpiration, TimeSpan slidingExpiration)
{
System.Web.Caching.Cache objCache = HttpRuntime.Cache;
objCache.Insert(CacheKey, objObject, null, absoluteExpiration, slidingExpiration);
} /**//// <summary>
/// 移除指定数据缓存
/// </summary>
public static void RemoveAllCache(string CacheKey)
{
System.Web.Caching.Cache _cache = HttpRuntime.Cache;
_cache.Remove(CacheKey);
} /**//// <summary>
/// 移除全部缓存
/// </summary>
public static void RemoveAllCache()
{
System.Web.Caching.Cache _cache = HttpRuntime.Cache;
IDictionaryEnumerator CacheEnum = _cache.GetEnumerator();
while (CacheEnum.MoveNext())
{
_cache.Remove(CacheEnum.Key.ToString());
}
}
}
Url重写
把带参数的改写成不带参数的,BookDetail.aspx?id=52 -->BookDetai_52.aspx
有利于SEO优化
(不推荐这样在管道写,推荐使用IIS插件 url rewrite)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Security;
using System.Web.SessionState; namespace BookShop.Web
{
public class Global : System.Web.HttpApplication
{ protected void Application_Start(object sender, EventArgs e)
{ } protected void Session_Start(object sender, EventArgs e)
{ }
/// <summary>
/// 请求管道中第一个事件触发以后调用的方法,完成URL重写。
/// URL重写。
///带参数的URL地址进行改写。改写成不带参数的。
//BookDetail.aspx?id=2; BookDetail_2.aspx //为什么将带参数的URL地址改成不带参数的?URL重写的目的就是SEO。 //SEO. //怎样进行URL重写? /// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void Application_BeginRequest(object sender, EventArgs e)
{
string url = Request.AppRelativeCurrentExecutionFilePath;//~/BookDetail_4976.aspx
Match match=Regex.Match(url, @"~/BookDetail_(\d+).aspx");
if (match.Success)
{
Context.RewritePath("/BookDetail.aspx?id="+match.Groups[].Value);
} //Match match = Regex.Match(url, @"~/BookDetail_(\d+).aspx");
//if (match.Success)
//{
// Context.RewritePath("/BookDetail.aspx?id=" + match.Groups[1].Value);
//} } protected void Application_AuthenticateRequest(object sender, EventArgs e)
{ } protected void Application_Error(object sender, EventArgs e)
{ } protected void Session_End(object sender, EventArgs e)
{ } protected void Application_End(object sender, EventArgs e)
{ }
}
}
SWFUpload 文件上传
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="CutPhoto.aspx.cs" Inherits="BookShop.Web.Member.CutPhoto" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<link href="../Css/themes/ui-lightness/jquery-ui-1.8.2.custom.css" rel="stylesheet" />
<script src="../js/jquery-1.7.1.js"></script>
<script src="../js/jquery-ui-1.8.2.custom.min.js"></script>
<script src="../SWFUpload/swfupload.js"></script>
<script src="../SWFUpload/handlers.js"></script>
<script type="text/javascript">
var swfu;
window.onload = function () {
swfu = new SWFUpload({
// Backend Settings
upload_url: "/ashx/upload.ashx?action=upload",
post_params: {
"ASPSESSID": "<%=Session.SessionID %>"
}, // File Upload Settings
file_size_limit: "2 MB",
file_types: "*.jpg;*.gif",
file_types_description: "JPG Images",
file_upload_limit: 0, // Zero means unlimited // Event Handler Settings - these functions as defined in Handlers.js
// The handlers are not part of SWFUpload but are part of my website and control how
// my website reacts to the SWFUpload events.
swfupload_preload_handler: preLoad,
swfupload_load_failed_handler: loadFailed,
file_queue_error_handler: fileQueueError,
file_dialog_complete_handler: fileDialogComplete,
upload_progress_handler: uploadProgress,
upload_error_handler: uploadError,
upload_success_handler: showImage,
upload_complete_handler: uploadComplete, // Button settings
button_image_url: "/SWFUpload/images/XPButtonNoText_160x22.png",
button_placeholder_id: "spanButtonPlaceholder",
button_width: 160,
button_height: 22,
button_text: '<span class="button">请选择上传图片<span class="buttonSmall">(2 MB Max)</span></span>',
button_text_style: '.button { font-family: Helvetica, Arial, sans-serif; font-size: 14pt; } .buttonSmall { font-size: 10pt; }',
button_text_top_padding: 1,
button_text_left_padding: 5, // Flash Settings
flash_url: "/SWFUpload/swfupload.swf", // Relative to this file
flash9_url: "/SWFUpload/swfupload_FP9.swf", // Relative to this file custom_settings: {
upload_target: "divFileProgressContainer"
}, // Debug Settings
debug: false
});
}
//上传成功以后调用该方法
function showImage(file, serverData) {
// $("#showPhoto").attr("src", serverData);
var data = serverData.split(':');
//将上传成功的图片作为DIV的背景
$("#hiddenImageUrl").val(data[0]);//将上传成功的图片路径存储到隐藏域中。
$("#divContent").css("backgroundImage", "url('" + data[0] + "')").css("width",data[1]+"px").css("height",data[2]+"px");
} $(function () {
//让DIV可以移动与拖动大小
$("#divCut").draggable({ containment: "#divContent", scroll: false }).resizable({
containment: "#divContent"
});
$("#btnCut").click(function () {
cutPhoto();
});
})
//截取头像
function cutPhoto() {
//计算要截取的头像的范围。
var y = $("#divCut").offset().top - $("#divContent").offset().top;//纵坐标
var x = $("#divCut").offset().left - $("#divContent").offset().left;
var width = $("#divCut").width();
var heigth = $("#divCut").height();
var pars = {
"x": x,
"y": y,
"width": width,
"height": heigth,
"action": "cut",
"imgSrc": $("#hiddenImageUrl").val() };
$.post("/ashx/upload.ashx", pars, function (data) {
$("#showPhoto").attr("src",data);
}); } </script>
</head>
<body>
<form id="form1" runat="server">
<div id="content">
<div id="swfu_container" style="margin: 0px 10px;">
<div>
<span id="spanButtonPlaceholder"></span>
</div>
<div id="divFileProgressContainer" style="height: 75px;"></div>
<div id="thumbnails"></div>
<div id="divContent" style="width:300px; height:300px;">
<div id="divCut" style="width:100px;height:100px; border:solid red 1px">
</div> </div>
<input type="button" value="截取图片" id="btnCut" />
<input type="hidden" id="hiddenImageUrl" />
<img id="showPhoto"></img>
</div>
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Web; namespace BookShop.Web.ashx
{
/// <summary>
/// upload 的摘要说明
/// </summary>
public class upload : IHttpHandler
{ public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "text/plain";
string action = context.Request["action"];
if (action == "upload")//上传图片
{
ProcessFileUpload(context);
}
else if (action =="cut")//截取图片
{
ProcessCutPhoto(context);
}
else
{
context.Response.Write("参数错误!!");
}
}
/// <summary>
/// 文件上传
/// </summary>
/// <param name="context"></param>
private void ProcessFileUpload(HttpContext context)
{
HttpPostedFile file = context.Request.Files["Filedata"];
if (file != null)
{
string fileName = Path.GetFileName(file.FileName);
string fileExt = Path.GetExtension(fileName);
if (fileExt == ".jpg")
{
string dir = "/ImageUpload/" + DateTime.Now.Year + "/" + DateTime.Now.Month + "/" + DateTime.Now.Day + "/";
if (!Directory.Exists(context.Request.MapPath(dir)))
{
Directory.CreateDirectory(context.Request.MapPath(dir));
}
string newfileName = Guid.NewGuid().ToString();
string fullDir = dir + newfileName + fileExt;
file.SaveAs(context.Request.MapPath(fullDir));
using (Image img = Image.FromFile(context.Request.MapPath(fullDir)))
{
context.Response.Write(fullDir + ":" + img.Width + ":" + img.Height);
} //file.SaveAs(context.Request.MapPath("/ImageUpload/"+fileName));
//context.Response.Write("/ImageUpload/" + fileName);
}
}
} /// <summary>
/// 图片的截取
/// </summary>
/// <param name="context"></param>
private void ProcessCutPhoto(HttpContext context)
{
int x = Convert.ToInt32(context.Request["x"]);
int y = Convert.ToInt32(context.Request["y"]);
int width = Convert.ToInt32(context.Request["width"]);
int height = Convert.ToInt32(context.Request["height"]);
string imgSrc = context.Request["imgSrc"];//获取上传成功的图片的路径
using (Bitmap map = new Bitmap(width, height))
{
using (Graphics g = Graphics.FromImage(map))
{
using (Image img = Image.FromFile(context.Request.MapPath(imgSrc)))
{
//第一个参数:表示画哪张图片.
//二:画多么大。
//三:画原图的哪块区域
g.DrawImage(img, new Rectangle(, , width, height), new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
string newfileName = Guid.NewGuid().ToString();
string fullDir = "/ImageUpload/" + newfileName + ".jpg";
map.Save(context.Request.MapPath(fullDir),System.Drawing.Imaging.ImageFormat.Jpeg);
context.Response.Write(fullDir); } }
}
} public bool IsReusable
{
get
{
return false;
}
}
}
}
一边处理程序调用session
一般处理程序调用session 必须实现接口 IReadOnlySessionState
spring.net
1 ioc 控制反转 以前自己new 这个是交给容器new
2 di 依赖注入 在创建类实例的时候 可以给一些属性完成初始化复制 (spring.net 配置文件中ref和value 等同,只是他是指的对象)
3 aop 面向切面编程 权限校验 日志处理
Unity 微软推出的实现 ioc di
Memcache
socket通信,网站服务器上安装客户端端,其他的缓存服务器 称为服务端,通过它的算法,取其中一个存取
没有主从 存取都是在memcache客户端
惰性删除:它并没有提供监控数据过期的机制,而是惰性的,当查询到某个key数据时,如果过期那么直接抛弃,如果存满了,把一些不经常访问的删除掉
http://www.cnblogs.com/caokai520/p/4390646.html
实例代码 建议修改一下 把下面的两个结合一下
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Memcached.ClientLibrary; namespace Hep.Memcached.Uitils
{
public class MemberHelper
{
static SockIOPool _pool; #region 创建Memcache服务
/// <summary>
/// 创建Memcache服务
/// </summary>
/// <param name="serverlist">IP端口列表</param>
/// <param name="poolName">Socket连接池名称</param>
/// <returns>Memcache客户端代理类</returns>
private static MemcachedClient CreateServer(ArrayList serverlist, string poolName)
{
if (_pool != null)
{
}
else
{
////初始化memcache服务器池
_pool = SockIOPool.GetInstance(poolName);
//设置Memcache池连接点服务器端。
_pool.SetServers(serverlist); ////其他参数根据需要进行配置 //各服务器之间负载均衡的设置
_pool.SetWeights(new int[] { });
//socket pool设置
_pool.InitConnections = ; //初始化时创建的连接数
_pool.MinConnections = ; //最小连接数
_pool.MaxConnections = ; //最大连接数
//连接的最大空闲时间,下面设置为6个小时(单位ms),超过这个设置时间,连接会被释放掉
_pool.MaxIdle = * * * ;
//通讯的超时时间,下面设置为3秒(单位ms),.NET版本没有实现
_pool.SocketTimeout = * ;
//socket连接的超时时间,下面设置表示连接不超时,即一直保持连接状态
_pool.SocketConnectTimeout = ;
_pool.Nagle = false; //是否对TCP/IP通讯使用Nalgle算法,.NET版本没有实现
//维护线程的间隔激活时间,下面设置为60秒(单位s),设置为0表示不启用维护线程
_pool.MaintenanceSleep = ;
//socket单次任务的最大时间,超过这个时间socket会被强行中断掉(当前任务失败)
_pool.MaxBusy = * ;
_pool.Initialize(); }
//创建了一个Memcache客户端的代理类。
MemcachedClient mc = new MemcachedClient();
mc.PoolName = poolName;
mc.EnableCompression = false;//是否压缩 return mc;
}
#endregion #region 缓存是否存在
/// <summary>
/// 缓存是否存在
/// </summary>
/// <param name="serverlist">IP端口列表</param>
/// <param name="key">键</param>
/// <returns></returns>
public static bool CacheIsExists(ArrayList serverlist, string poolName, string key)
{
MemcachedClient mc = CreateServer(serverlist, poolName); if (mc.KeyExists(key))
{
return true;
}
else
{
return false;
} }
#endregion #region 添加缓存 #region 添加缓存(键不存在则添加,键存在则不能添加)
/// <summary>
/// 添加缓存(键不存在则添加,键存在则不能添加)
/// </summary>
/// <param name="serverlist">IP端口列表</param>
/// <param name="poolName">连接池名称</param>
/// <param name="key">键</param>
/// <param name="value">值</param>
/// <param name="minutes">过期分钟数</param>
/// <returns></returns>
public static bool AddCache(ArrayList serverlist, string poolName, string key, string value, int minutes)
{
MemcachedClient mc = CreateServer(serverlist, poolName);
return mc.Add(key, value, DateTime.Now.AddMinutes(minutes));
}
#endregion #region 添加缓存(键不存在则添加,键存在则不能添加)
/// <summary>
/// 添加缓存(键不存在则添加,键存在则不能添加)
/// </summary>
/// <param name="serverlist">IP端口列表</param>
/// <param name="poolName">连接池名称</param>
/// <param name="key">键</param>
/// <param name="value">值</param>
/// <param name="minutes">过期分钟数</param>
/// <returns></returns>
public static bool AddCache(ArrayList serverlist, string poolName, string key, object value, int minutes)
{
MemcachedClient mc = CreateServer(serverlist, poolName);
return mc.Add(key, value, DateTime.Now.AddMinutes(minutes));
}
#endregion #region 添加缓存(键不存在则添加,键存在则覆盖)
/// <summary>
/// 添加缓存(键不存在则添加,键存在则覆盖)
/// </summary>
/// <param name="serverlist">IP端口列表</param>
/// <param name="poolName">连接池名称</param>
/// <param name="key">键</param>
/// <param name="value">值</param>
/// <param name="minutes">过期分钟数</param>
/// <returns></returns>
public static bool SetCache(ArrayList serverlist, string poolName, string key, string value, int minutes)
{
MemcachedClient mc = CreateServer(serverlist, poolName);
return mc.Set(key, value, DateTime.Now.AddMinutes(minutes));
}
#endregion #region 添加缓存(键不存在则添加,键存在则覆盖)
/// <summary>
/// 添加缓存(键不存在则添加,键存在则覆盖) object 类型
/// </summary>
/// <param name="serverlist">IP端口列表</param>
/// <param name="poolName">连接池名称</param>
/// <param name="key">键</param>
/// <param name="value">值</param>
/// <param name="minutes">过期分钟数</param>
/// <returns></returns>
public static bool SetCache(ArrayList serverlist, string poolName, string key, object value, int minutes)
{
MemcachedClient mc = CreateServer(serverlist, poolName);
return mc.Set(key, value, DateTime.Now.AddMinutes(minutes));
}
#endregion #endregion #region 替换缓存 #region 替换缓存(键存在的才能替换,不存在则不替换)
/// <summary>
/// 替换缓存(键存在的才能替换,不存在则不替换)
/// </summary>
/// <param name="serverlist">IP端口列表</param>
/// <param name="poolName">连接池名称</param>
/// <param name="key">键</param>
/// <param name="value">值</param>
/// <param name="minutes">过期分钟数</param>
/// <returns></returns>
public static bool ReplaceCache(ArrayList serverlist, string poolName, string key, string value, int minutes)
{
MemcachedClient mc = CreateServer(serverlist, poolName);
return mc.Replace(key, value, DateTime.Now.AddMinutes(minutes));
}
#endregion #endregion #region 获取缓存 #region 获取单个键对应的缓存
/// <summary>
/// 获取单个键对应的缓存
/// </summary>
/// <param name="serverlist">IP端口列表</param>
/// <param name="poolName">连接池名称</param>
/// <param name="key">键</param>
/// <returns></returns>
public static object GetCache(ArrayList serverlist, string poolName, string key)
{
MemcachedClient mc = CreateServer(serverlist, poolName);
if (mc.KeyExists(key))
{
return mc.Get(key);
}
else
{
return "";
}
}
#endregion #region 获取键数组对应的值
/// <summary>
/// 获取键数组对应的值
/// </summary>
/// <param name="serverlist">IP端口列表</param>
/// <param name="poolName">连接池名称</param>
/// <param name="keys">键列表</param>
/// <returns>Hashtable键值对</returns>
public static Hashtable GetCacheHt(ArrayList serverlist, string poolName, string[] keys)
{
MemcachedClient mc = CreateServer(serverlist, poolName);
return mc.GetMultiple(keys);
}
#endregion #region 获取键数组对应的值
/// <summary>
/// 获取键数组对应的值
/// </summary>
/// <param name="serverlist">IP端口列表</param>
/// <param name="poolName">连接池名称</param>
/// <param name="keys">键列表</param>
/// <returns>值的数组(不包含键)</returns>
public static object[] GetCacheList(ArrayList serverlist, string poolName, string[] keys)
{
MemcachedClient mc = CreateServer(serverlist, poolName);
object[] list = mc.GetMultipleArray(keys);
ArrayList returnList = new ArrayList();
for (int i = ; i < list.Length; i++)
{
if (list[i] != null)
{
returnList.Add(list[i]);
}
}
return returnList.ToArray();
}
#endregion #endregion #region 删除缓存
/// <summary>
/// 删除缓存
/// </summary>
/// <param name="serverlist">IP端口列表</param>
/// <param name="poolName">连接池名称</param>
/// <param name="key">键</param>
/// <returns></returns>
public static bool DelCache(ArrayList serverlist, string poolName, string key)
{
MemcachedClient mc = CreateServer(serverlist, poolName);
return mc.Delete(key);
}
#endregion #region 清空所有缓存
/// <summary>
/// 清空所有缓存
/// </summary>
/// <param name="serverlist">IP端口列表</param>
/// <param name="poolName">连接池名称</param>
/// <returns></returns>
public static bool FlushAll(ArrayList serverlist, string poolName)
{
MemcachedClient mc = CreateServer(serverlist, poolName);
return mc.FlushAll();
}
#endregion }
}
{
private static readonly ILog Logger = LogManager.GetCurrentClassLogger(); private readonly MemcachedClient _cache; public MemcachedCachePolicy()
{
_cache = MemcachedClient.GetInstance("MemcachedConfig"); _cache.MaxPoolSize = ;
} public void Add<T>(string key, T value)
{
if (_cache.Set(key, value))
{
Logger.Debug("Set _cache for key successed, key[" + key + "]");
}
else
{
Logger.Debug("Set _cache for key failed");
}
} public void Add<T>(string key, T value, DateTime dt)
{
_cache.Set(key, value, dt);
} public T Get<T>(string key)
{
try
{
return (T)_cache.Get(key);
}
catch (Exception e)
{
Logger.Debug("Get _cache for key failed, key[" + key + "]", e);
_cache.Delete(key);
return default(T);
}
} public void Add(string key, object value)
{
_cache.Set(key, value);
} public void Add(string key, object value, DateTime dt)
{
_cache.Set(key, value, dt);
} public object Get(string key)
{
return _cache.Get(key);
} public void Delete(string key)
{
_cache.Delete(key);
}
}
using Memcached.ClientLibrary;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace CZBK.ItcastOA.Common
{
public class MemcacheHelper
{
private static readonly MemcachedClient mc = null; static MemcacheHelper()
{
//最好放在配置文件中
string[] serverlist = { "127.0.0.1:11211", "10.0.0.132:11211" }; //初始化池
SockIOPool pool = SockIOPool.GetInstance();
pool.SetServers(serverlist); pool.InitConnections = ;
pool.MinConnections = ;
pool.MaxConnections = ; pool.SocketConnectTimeout = ;
pool.SocketTimeout = ; pool.MaintenanceSleep = ;
pool.Failover = true; pool.Nagle = false;
pool.Initialize(); // 获得客户端实例
mc = new MemcachedClient();
mc.EnableCompression = false;
}
/// <summary>
/// 存储数据
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns></returns>
public static bool Set(string key,object value)
{
return mc.Set(key, value);
}
public static bool Set(string key, object value,DateTime time)
{
return mc.Set(key, value,time);
}
/// <summary>
/// 获取数据
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static object Get(string key)
{
return mc.Get(key);
}
/// <summary>
/// 删除
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public static bool Delete(string key)
{
if (mc.KeyExists(key))
{
return mc.Delete(key); }
return false; }
}
}
多线程处理 lucene.net 单例模式
using CZBK.ItcastOA.Model.EnumType;
using Lucene.Net.Analysis.PanGu;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Store;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Web; namespace CZBK.ItcastOA.WebApp.Models
{
public sealed class IndexManager
{
//不用写跟新方法了,因为添加的时候,是先删除然后添加
//单列模式 sealed 不允许被继承
// 只允许在自己的类中 创建私有的构造函数
//readonly 不允许改 只读的 private static readonly IndexManager indexManager = new IndexManager();
private IndexManager()
{
//创建私有的构造函数 保证不被外部new
}
public static IndexManager GetInstance()
{
return indexManager;
}
public Queue<ViewModelContent> queue = new Queue<ViewModelContent>();
/// <summary>
/// 向队列中添加数据
/// </summary>
/// <param name="id"></param>
/// <param name="title"></param>
/// <param name="content"></param>
public void AddQueue(int id, string title, string content)
{
ViewModelContent viewModel = new ViewModelContent();
viewModel.Id = id;
viewModel.Title = title;
viewModel.Content = content;
viewModel.LuceneTypeEnum = LuceneTypeEnum.Add;
queue.Enqueue(viewModel);
}
/// <summary>
/// 要删除的数据
/// </summary>
/// <param name="id"></param>
public void DeleteQueue(int id)
{
ViewModelContent viewModel = new ViewModelContent();
viewModel.Id = id;
viewModel.LuceneTypeEnum = LuceneTypeEnum.Delete;
queue.Enqueue(viewModel);
} /// <summary>
/// 开始一个线程
/// </summary>
public void StartThread()
{
Thread thread = new Thread(WriteIndexContent);
thread.IsBackground = true;
thread.Start();
}
/// <summary>
/// 检查队列中是否有数据,如果有数据获取。
/// </summary>
private void WriteIndexContent()
{
while (true)
{
if (queue.Count > )
{
CreateIndexContent();
}
else
{
Thread.Sleep();
}
}
}
private void CreateIndexContent()
{
string indexPath = @"C:\lucenedir";//注意和磁盘上文件夹的大小写一致,否则会报错。将创建的分词内容放在该目录下。//将路径写到配置文件中。
FSDirectory directory = FSDirectory.Open(new DirectoryInfo(indexPath), new NativeFSLockFactory());//指定索引文件(打开索引目录) FS指的是就是FileSystem
bool isUpdate = IndexReader.IndexExists(directory);//IndexReader:对索引进行读取的类。该语句的作用:判断索引库文件夹是否存在以及索引特征文件是否存在。
if (isUpdate)
{
//同时只能有一段代码对索引库进行写操作。当使用IndexWriter打开directory时会自动对索引库文件上锁。
//如果索引目录被锁定(比如索引过程中程序异常退出),则首先解锁(提示一下:如果我现在正在写着已经加锁了,但是还没有写完,这时候又来一个请求,那么不就解锁了吗?这个问题后面会解决)
if (IndexWriter.IsLocked(directory))
{
IndexWriter.Unlock(directory);
}
}
IndexWriter writer = new IndexWriter(directory, new PanGuAnalyzer(), !isUpdate, Lucene.Net.Index.IndexWriter.MaxFieldLength.UNLIMITED);//向索引库中写索引。这时在这里加锁。
//如果队列中有数据,获取队列中的数据写到Lucene.Net中。
while(queue.Count>)
{
ViewModelContent viewModel=queue.Dequeue();
writer.DeleteDocuments(new Term("Id",viewModel.Id.ToString()));//删除
if (viewModel.LuceneTypeEnum == LuceneTypeEnum.Delete)
{
continue;
}
Document document = new Document();//表示一篇文档。
//Field.Store.YES:表示是否存储原值。只有当Field.Store.YES在后面才能用doc.Get("number")取出值来.Field.Index. NOT_ANALYZED:不进行分词保存
document.Add(new Field("Id", viewModel.Id.ToString(), Field.Store.YES, Field.Index.NOT_ANALYZED)); //Field.Index. ANALYZED:进行分词保存:也就是要进行全文的字段要设置分词 保存(因为要进行模糊查询) //Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS:不仅保存分词还保存分词的距离。
document.Add(new Field("Title", viewModel.Title, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
document.Add(new Field("Content", viewModel.Content, Field.Store.YES, Field.Index.ANALYZED, Lucene.Net.Documents.Field.TermVector.WITH_POSITIONS_OFFSETS));
writer.AddDocument(document); }
writer.Close();//会自动解锁。
directory.Close();//不要忘了C
} }
}
调用上面的单列
using CZBK.ItcastOA.WebApp.Models;
using log4net;
using Spring.Web.Mvc;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing; namespace CZBK.ItcastOA.WebApp
{
// 注意: 有关启用 IIS6 或 IIS7 经典模式的说明,
// 请访问 http://go.microsoft.com/?LinkId=9394801 public class MvcApplication : SpringMvcApplication //System.Web.HttpApplication
{
protected void Application_Start()
{
log4net.Config.XmlConfigurator.Configure();//读取了配置文件中关于Log4Net配置信息.
IndexManager.GetInstance().StartThread();//开始线程扫描LuceneNet对应的数据队列。 这里就不能new了 因为你是单列模式 所以直接掉他的方法创建实例,他只允许自己的内部创建 AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
//开启一个线程,扫描异常信息队列。
string filePath = Server.MapPath("/Log/");
ThreadPool.QueueUserWorkItem((a) => {
while (true)
{
//判断一下队列中是否有数据
if (MyExceptionAttribute.ExecptionQueue.Count() > )
{
Exception ex=MyExceptionAttribute.ExecptionQueue.Dequeue();
if (ex != null)
{
//将异常信息写到日志文件中。
//string fileName = DateTime.Now.ToString("yyyy-MM-dd");
//File.AppendAllText(filePath+fileName+".txt",ex.ToString(),System.Text.Encoding.UTF8);
ILog logger = LogManager.GetLogger("errorMsg");
logger.Error(ex.ToString());
}
else
{
//如果队列中没有数据,休息
Thread.Sleep();
}
}
else
{
//如果队列中没有数据,休息
Thread.Sleep();
}
} },filePath); }
//异常处理的过滤器。
}
}
测试上面的队列
using CZBK.ItcastOA.WebApp.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc; namespace CZBK.ItcastOA.WebApp.Controllers
{
public class TestController : Controller
{
//
// GET: /Test/ public ActionResult Index()
{
return View();
}
public ActionResult ShowResult()
{
int a = ;
int b = ;
int c = a / b;
return Content(c.ToString());
}
public ActionResult TestCreate()
{
Model.Books model = new Model.Books();
model.AurhorDescription = "jlkfdjf";
model.Author = "asfasd";
model.CategoryId = ;
model.Clicks = ;
model.ContentDescription = "Ajax高级编程";
model.EditorComment = "adfsadfsadf";
model.ISBN = "";
model.PublishDate = DateTime.Now;
model.PublisherId = ;
model.Title = "Ajax";
model.TOC = "aaaaaaaaaaaaaaaa";
model.UnitPrice = 22.3m;
model.WordsCount = ;
//1.将数据先存储到数据库中。获取刚插入的数据的主键ID值。
IndexManager.GetInstance().AddQueue(, model.Title, model.ContentDescription);//向队列中添加
return Content("ok");
} }
}
lucene.net 返回的时候 为什么只返回文档的编号 而不是吧整个文档返回?
节省内存,如果把符合结果的文档全部返回,那样占的内存就大了
拿到文档ID之后 在根据文档ID 单条搜索文档内容
此处我感觉 lucene是可以存文档内容的 看具体需求吧
区分同一from表单不同按钮提交
当一个form表单 有两个提交按钮的时候怎么区别? 比如 “搜索”、“创建索引库”
根据 submit的值,点哪个提交哪个的值,另一个值是空
if(!string.IsNullOrEmpty(Request["btnSearth"])){}
Quartz.net
using Quartz;
using Quartz.Impl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace CZBK.ItcastOA.QuartzNet
{
class Program
{
static void Main(string[] args)
{
IScheduler sched;
ISchedulerFactory sf = new StdSchedulerFactory();
sched = sf.GetScheduler();
//IndexJob为实现了IJob接口的类,执行的事情写在Execute方法内
//job1:工作名字 随便写 group1:分组的组名 随便写
JobDetail job = new JobDetail("job1", "group1", typeof(IndexJob)); //5秒后开始第一次运行
DateTime ts = TriggerUtils.GetNextGivenSecondDate(null, ); //每隔5s执行一次/TimeSpan.FromHours(1);//一小时
TimeSpan interval = TimeSpan.FromSeconds(); //每若干小时运行一次,小时间隔由appsettings中的IndexIntervalHour参数指定
//trigger1:触发器名字 随便写
Trigger trigger = new SimpleTrigger("trigger1", "group1", "job1", "group1", ts, null,SimpleTrigger.RepeatIndefinitely, interval); sched.AddJob(job, true);
sched.ScheduleJob(trigger);
sched.Start();
Console.ReadKey();
}
}
}
using Quartz;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace CZBK.ItcastOA.QuartzNet
{
/// <summary>
/// 完成工作任务的定义。
/// </summary>
public class IndexJob:IJob
{
/// <summary>
/// 将明细表中的数据插入到汇总表中。
/// </summary>
/// <param name="context"></param>
IBLL.IKeyWordsRankService bll = new BLL.KeyWordsRankService();
public void Execute(JobExecutionContext context)
{
//执行的工作
bll.DeleteAllKeyWordsRank();
bll.InsertKeyWordsRank();
}
}
}
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks; namespace CZBK.ItcastOA.BLL
{
public partial class KeyWordsRankService:BaseService<Model.KeyWordsRank>,IBLL.IKeyWordsRankService
{
/// <summary>
/// 将统计的明细表的数据插入。
/// </summary>
/// <returns></returns>
public bool InsertKeyWordsRank()
{
string sql = "insert into KeyWordsRank(Id,KeyWords,SearchCount) select newid(),KeyWords,count(*) from SearchDetails where DateDiff(day,SearchDetails.SearchDateTime,getdate())<=7 group by SearchDetails.KeyWords";
return this.CurrentDBSession.ExecuteSql(sql)>;
}
/// <summary>
/// 删除汇总中的数据。
/// </summary>
/// <returns></returns>
public bool DeleteAllKeyWordsRank()
{
//用这句删除表中的数据是非常快的
string sql = "truncate table KeyWordsRank";
return this.CurrentDBSession.ExecuteSql(sql)>;
}
public List<string> GetSearchMsg(string term)
{
//KeyWords like term%
string sql = "select KeyWords from KeyWordsRank where KeyWords like @term";
return this.CurrentDBSession.ExecuteQuery<string>(sql, new SqlParameter("@term",term+"%" ));
}
}
}
session原理
memcache 分布式session原理 创建缓存的唯一key GUID 然后以cookie的形式存客户浏览器内存上,这就是原生session的原理
队列:
dot.net 自带了队列 队列和栈相反,队列是先进 先出
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Web;
using System.Web.Mvc; namespace CZBK.ItcastOA.WebApp.Models
{
public class MyExceptionAttribute : HandleErrorAttribute
{
//静态的 保证在一个队列里,如果每次都new得话就不是一个队列了
public static Queue<Exception> ExecptionQueue = new Queue<Exception>();
/// <summary>
/// 可以捕获异常数据
/// </summary>
/// <param name="filterContext"></param>
public override void OnException(ExceptionContext filterContext)
{ base.OnException(filterContext);
Exception ex = filterContext.Exception;
//写到队列
ExecptionQueue.Enqueue(ex);
//跳转到错误页面.
filterContext.HttpContext.Response.Redirect("/Error.html");
}
}
}
热词展示
autocomplete 插件 效果 类似智能提示 当你在搜索框输入“你” 会提示“你好”“你好吗”等下拉一系列 你提供的词
WebService
socket通信
方法上又一个 [webMethod] 特性标签 证明别的程序可以调用该方法
soap 基于http协议 类似http协议 有请求头 请求体
另一个应用场景 SOA 面向服务编程 作为项目的服务层
WCF 协议就比较多了 http tcp 契约:服务 消息 错误等四大契约
要引用 serviceModel 在接口上添加特性标签 [serviceContract](服务契约) 在方法上添加特性标签[Operationcontract](操作契约)
部署:IIS 控制台 winfor 等都可以 可以寄宿到多种程序
为了使AJAX或JS调用服务,必须标记服务的AspNet兼容模式为Allowed或Required。其次,操作契约必须标记为WebGet或WebInvoke,WebGet属性标记了一个可以用http get方法调用的操作,而WebInvoke属性标记了一个可以用http post方法调用的操作。
http://www.cnblogs.com/cokkiy/archive/2009/10/22/jsCallWCF.html
-- 垃圾堆
手动解耦 可以在web.config 配置dll 达到解耦效果
抽象工厂 通过反射
简单工厂 直接new
ztree:自己不用管层级关系,给一组json数组,主要根据pid分层
如果想给数据 可以创建一个ztree的的model 然后给model复制,然后序列化传给前台
savechange 设计模式:工作单元模式 :一个业务对多张表的操作,只连一次数据库,完成条记录的更新
简单工厂:返回父类或者接口的多种形态
抽象工厂:通过反射创建
单例:类似静态类 可以继承 扩展 延迟加载.....保证程序只new一次 比如队列 就可以放在单列里面
session跨域 也是用内存 cookie实现
webapi 图片分布式存储 nginx monodb QQ登录 工作流 图片延迟加载
Echarts NPOI t4 lucene.Net+盘古分词 fineui log4net json.net
Hbiulder 分布式session memcache redis Quartz.net soa aop 正则 ztree
队列 缓存 管道19事件
分布式session解决:唯一key cookie存到客户端
富文本 异步 json 序列化 ORM 二维码
clr (common language ruantian) 公共语言运行时 .net framwork
il .net语言转换为机器语言的额中间语言 伪汇编
数据库三范式
存储过程 触发器 设计模式
数据结构 二叉树 集合 图形
排序算法 冒泡等
压力测试http://www.ikende.com/
【知识碎片】Net项目经验积累的更多相关文章
- java程序员面试交流项目经验
粘贴自:https://blog.csdn.net/wangyuxuan_java/article/details/8778211 1:请你介绍一下你自己 这是面试官常问的问题.一般人回答这个问题过于 ...
- 转:java项目经验面试总结
转载: 在前期已经讲过怎样分析自己,对自己进行一个准确的定位,选择一个合适的求职方向!并结合自己的实际个人情况来写一份针对性很强的个人简历!个人简历就是个人的广告!好的简历可以更受到用人需求单位青睐! ...
- Java项目经验——程序员成长的关键(转载)
Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的分析与设计技巧3.掌握用例驱动.以 ...
- Java项目经验
Java项目经验 转自CSDN. Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的 ...
- 最近面试java后端开发的感受:如果就以平时项目经验来面试,通过估计很难——再论面试前的准备
在上周,我密集面试了若干位Java后端的候选人,工作经验在3到5年间.我的标准其实不复杂:第一能干活,第二Java基础要好,第三最好熟悉些分布式框架,我相信其它公司招初级开发时,应该也照着这个标准来面 ...
- java面试项目经验:框架及应用
Java项目经验 Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点:1.掌握项目开发的基本步骤2.具备极强的面向对象的分析与设计技巧3 ...
- Java项目经验——程序员成长的钥匙
本文转载至:http://geek.csdn.net/news/detail/109880,像我这样的菜鸟应该多看几遍这样的文章,学起来才更加有动力和方向. Java就是用来做项目的!Java的主要应 ...
- Javaee项目经验须知
Java的主要应用领域就是企业级的项目开发!具体要点(09年,那一年我去面试,被拒了几次,想起来还不错!他锻炼了我的心理素质,让我体会到很多,笑一个吧!): 1.掌握项目开发的基本步骤 2.具备极强的 ...
- 如何在面试中介绍自己的项目经验(面向java改进版)
本人于3年前写的博文,如何在面试中介绍自己的项目经验,经过大家的捧场,陆续得到了将近7万个点击量,也得到了众多网站公众号的转载,不过自己感觉,这篇文章更多的是偏重于方法,没有具体给到Java方面相关的 ...
随机推荐
- Guest CPU model configuration in libvirt with QEMU/KVM
每个hypervisor对于guest能看到的cpu model定义都不同,Xen 提供host pass through,所以guest能看到的cpu和host完全相同. QEMU/KVM中gues ...
- Apache虚拟主机配置模板
/////////////////////////////////写在前头////////////////////////////////////////1.Apache HTTP 服务器2.4文档: ...
- unity监测按下键的键值并输出+unity键值
using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using U ...
- 【LABVIEW到C#】1》ini的操作
using System; using System.IO; using System.Drawing; using System.Collections; using System.Componen ...
- WebUI 常用
//鼠标移动显示div //position:absolute这个是绝对定位:是相对于浏览器的定位.比如:position:absolute:left:20px;top:80px; 这个容器始终位于距 ...
- C语言基础二
C--顺序程序设计 赋值语句 赋值语句和赋值表达式的区别: if((a = b) > 0) t = 0; 字符数据的输入输出 putchar函数 该函数为字符输出函数,其作用是向终端数出一个字符 ...
- Node.js核心模块_全局变量、util学习
全局对象 javascript的全局对象是window,他及其所有属性都可以在程序的任何地方访问.即全局变量. 而在node中全局对象是global,所有全局变量都是global对象的属性,包括其本身 ...
- ADO.NET异步操作测试
配置文件: <?xml version="1.0"?> <configuration> <startup> <supportedRunti ...
- 慕课网python分布式爬虫打造搜索引擎视频中爬取伯乐网文章
代码:https://github.com/longbigbeard/scrapy_demo
- SpringCloud 教程 | 第一篇: 服务的注册与发现(Eureka)
一.spring cloud简介 spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选.分布式会话等等.它运 ...