常见.NET功能代码汇总html
获取缓存:首先从本地缓存获取,若是没有,再去读取分布式缓存
写缓存:同时写本地缓存和分布式缓存node
private static T GetGradeCache<T>(string key) where T:struct { MemoryCacheManager localCache = MemoryCacheManager.Instance; if (!localCache.IsSet(key)) { //本地不存在此缓存 T remoteValue = MemCacheManager.Instance.Get<T>(key); if (!ValueType.Equals(remoteValue, default(T))) { //若是远程有 localCache.Set(key, remoteValue, 1); } else { localCache.SetFromSeconds(key, default(T), 10); } return remoteValue; } T value = localCache.Get<T>(key); return value; } private static void SetGradeCache<T>(string key,T Value,int time) where T : struct { MemoryCacheManager localCache = MemoryCacheManager.Instance; localCache.Remove(key); localCache.Set(key, Value, time); MemCacheManager.Instance.Remove(key); MemCacheManager.Instance.Set(key, Value, time); }
有时候,咱们须要求相对于当前根目录的相对目录,好比将日志文件存储在站点目录以外,咱们可使用 ../logs/ 的方式:web
string vfileName = string.Format("../logs/{0}_{1}_{2}.log", logFileName, System.Environment.MachineName, DateTime.Now.ToString("yyyyMMdd")); string rootPath = HttpContext.Current.Server.MapPath("/"); string targetPath = System.IO.Path.Combine(rootPath, vfileName); string fileName = System.IO.Path.GetFullPath(targetPath); string fileDir = System.IO.Path.GetDirectoryName(fileName); if (!System.IO.Directory.Exists(fileDir)) System.IO.Directory.CreateDirectory(fileDir);
这个代码会在站点目录以外的日志目录,创建一个 代机器名称的按照日期区分的日志文件。后端
日志文件可能会并发的写入,此时可能会提示“文件被另一个进程占用”,所以能够屡次尝试写入。下面的方法会递归的进行文件写入尝试,若是尝试次数用完才会最终报错。数组
/// <summary> /// 保存日志文件 /// </summary> /// <param name="logFileName">不带扩展名文件名</param> /// <param name="logText">日志内容</param> /// <param name="tryCount">若是出错的尝试次数,建议不大于100,若是是0则不尝试</param> public static void SaveLog(string logFileName, string logText, int tryCount) { string vfileName = string.Format("..\\logs\\{0}_{1}_{2}.log", logFileName, System.Environment.MachineName, DateTime.Now.ToString("yyyyMMdd")); string rootPath = System.AppDomain.CurrentDomain.BaseDirectory; string targetPath = System.IO.Path.Combine(rootPath, vfileName); string fileName = System.IO.Path.GetFullPath(targetPath); string fileDir = System.IO.Path.GetDirectoryName(fileName); if (!System.IO.Directory.Exists(fileDir)) System.IO.Directory.CreateDirectory(fileDir); try { System.IO.File.AppendAllText(fileName, logText); tryCount = 0; } catch (Exception ex) { if (tryCount > 0) { System.Threading.Thread.Sleep(1000); logText = logText + "\r\nSaveLog,try again times =" + tryCount + " ,Error:" + ex.Message; tryCount--; SaveLog(logFileName, logText, tryCount); } else { throw new Exception("Save log file Error,try count more times!"); } } }
string GetRemoteIP() { string result = HttpContext.Request.ServerVariables["HTTP_X_FORWARDED_FOR"]; if (null == result || result == String.Empty) { result = HttpContext.Request.ServerVariables["REMOTE_ADDR"]; } if (null == result || result == String.Empty) { result = HttpContext.Request.UserHostAddress; } return result;
能够分为3种方式,
1)ASP.NET MVC 在控制器的默认Action里面获取请求其它Action的路径
好比在默认的 Index Action里面获取路径,以下:浏览器
string sso_url= "http://" + Request.Url.Authority + Request.Url.AbsolutePath + "/SSO?id=" + userid;
2)在其它Action里面获取当前控制器的路径 缓存
string ctrName = RouteData.Values["controller"].ToString(); string redirectUrl = "http://" + Request.Url.Authority + "/" + ctrName + "/SSO?id=" + userid;
3)直接获取当前Action请求的路径安全
string url=Request.Url.ToString();
须要指定Context的contentType 为“text/plain”,代码以下:多线程
public ActionResult SendMessage() { string txt="你好!"; return Content(text, "text/plain", System.Text.Encoding.UTF8); }
这里主要使用XDocument,XElement对象来操做XML内容,以下代码:并发
public static class XDocumentExtentsion { //生成XML的申明部分 public static string ToStringWithDeclaration(this XDocument doc, SaveOptions options = SaveOptions.DisableFormatting) { return doc.Declaration.ToString() + doc.ToString(options); } } public string CreateMsgResult(string loginUserId,string corpid, string msg,string ts) { var xDoc = new XDocument( new XDeclaration("1.0", "UTF-8", null), new XElement("result", new XElement("corpid", corpid), new XElement("userid", loginUserId), new XElement("ts", ts), new XElement("sendmsg", msg) )); return xDoc.ToStringWithDeclaration(); } public ResponseMessage ParseXMLString(string xml) { var xDoc = XDocument.Parse(xml); if (xDoc == null) return null; var root = xDoc.Element("result"); if(root==null) throw new Exception ("not found the 'result' root node,input XML\r\n"+xml); ResponseMessage result = new ResponseMessage() { ErrorCode = root.Element("rescode").Value, ErrorMessage = root.Element("resmsg").Value, RedirectUrl = root.Element("redirect_url") == null ? "" : root.Element("redirect_url").Value }; return result; }
使用 HttpWebRequest和HttpWebResponse 对象完成Web访问,若是是.NET 4.5,建议直接使用 HttpClient对象:
/// <summary> /// 获取请求结果 /// </summary> /// <param name="requestUrl">请求地址</param> /// <param name="timeout">超时时间(秒)</param> /// <param name="requestXML">请求xml内容</param> /// <param name="isPost">是否post提交</param> /// <param name="encoding">编码格式 例如:utf-8</param> /// <param name="errorMsg">抛出的错误信息</param> /// <returns>返回请求结果</returns> public static string HttpWebRequest(string requestUrl, int timeout, string requestXML, bool isPost, string encoding, out string errorMsg, string contentType = "application/x-www-form-urlencoded") { errorMsg = string.Empty; string result = string.Empty; try { byte[] bytes = System.Text.Encoding.GetEncoding(encoding).GetBytes(requestXML); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(requestUrl); request.Referer = requestUrl; request.Method = isPost ? "POST" : "GET"; request.Timeout = timeout * 1000; if (isPost) { request.ContentType = contentType;// "application/x-www-form-urlencoded"; request.ContentLength = bytes.Length; using (Stream requestStream = request.GetRequestStream()) { requestStream.Write(bytes, 0, bytes.Length); requestStream.Close(); } } HttpWebResponse response = (HttpWebResponse)request.GetResponse(); Stream responseStream = response.GetResponseStream(); if (responseStream != null) { StreamReader reader = new StreamReader(responseStream, System.Text.Encoding.GetEncoding(encoding)); result = reader.ReadToEnd(); reader.Close(); responseStream.Close(); request.Abort(); response.Close(); return result.Trim(); } } catch (Exception ex) { errorMsg =string.Format("Error Message:{0},Request Url:{1},StackTrace:{2}", ex.Message ,requestUrl , ex.StackTrace); } return result; }
(转自 http://blog.sina.com.cn/s/blog_4a77f0630100hav3.html)
最近项目遇到这么个问题。客户要求用web页面,点击一个连接,调用本地的一个程序。
参考了一下qq的方式。
tencent://Message/?Uin=000000&websiteName=qzone.qq.com&Menu=yes
在注册表里面添加下面,就能实现,详细内容见原文
有时候,向一个List对象调用Add 方法,会出现“索引超出了数组界限”这样的问题,此时能够考虑使用线程安全的集合,但对于业务上设定了集合的最大值的状况下,用线程安全集合就有点重了,效率不高,此时能够经过 Interlocked.CompareExchange 来实现,具体代码以下:
private int length=0; private int maxLength=50; private int[] Arr=new int[maxLength]; //使用循环数组,安全的添加元素 void Add(int value){ int p= Interlocked.CompareExchange(ref length,0,maxLength); if(p==length) { //说明length变量而且没有达到最大值,并安全的返回length当时的值 Arr[p]=value; } else { //数组元素已经达到上限,须要触发另外的操做,好比将数组所有输出 // To Do //以后,再将当前位置的元素写入 //此时,length多是0,也多是其它值 Arr[length]=value; } Interlocked.Increment(ref length); }
最近作一个WPF项目,后端API推送过来的数据要更新WPF界面的数据,发现有些数据没有跟后端数据状态一致。一般状况下,WPF绑定的Model数据集合都是继承于ObservableCollection 的,可是在当前状况下会有问题,这是能够封装一个异步的数据集合:
public class AsyncObservableCollection<T> : ObservableCollection<T> { //获取当前线程的SynchronizationContext对象 private SynchronizationContext _synchronizationContext = SynchronizationContext.Current; public AsyncObservableCollection() { } public AsyncObservableCollection(IEnumerable<T> list) : base(list) { } protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e) { if (SynchronizationContext.Current == _synchronizationContext) { //若是操做发生在同一个线程中,不须要进行跨线程执行 RaiseCollectionChanged(e); } else { //若是不是发生在同一个线程中 //准确说来,这里是在一个非UI线程中,须要进行UI的更新所进行的操做 _synchronizationContext.Post(RaiseCollectionChanged, e); } } private void RaiseCollectionChanged(object param) { // 执行 base.OnCollectionChanged((NotifyCollectionChangedEventArgs)param); } protected override void OnPropertyChanged(PropertyChangedEventArgs e) { if (SynchronizationContext.Current == _synchronizationContext) { // Execute the PropertyChanged event on the current thread RaisePropertyChanged(e); } else { // Post the PropertyChanged event on the creator thread _synchronizationContext.Post(RaisePropertyChanged, e); } } private void RaisePropertyChanged(object param) { // We are in the creator thread, call the base implementation directly base.OnPropertyChanged((PropertyChangedEventArgs)param); } }
更多信息,请参考: