惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

H
Help Net Security
博客园 - Franky
GbyAI
GbyAI
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
爱范儿
爱范儿
IT之家
IT之家
酷 壳 – CoolShell
酷 壳 – CoolShell
aimingoo的专栏
aimingoo的专栏
博客园_首页
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Recent Announcements
Recent Announcements
Scott Helme
Scott Helme
有赞技术团队
有赞技术团队
M
MIT News - Artificial intelligence
C
CERT Recently Published Vulnerability Notes
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Jina AI
Jina AI
F
Fortinet All Blogs
N
Netflix TechBlog - Medium
L
LangChain Blog
L
LINUX DO - 最新话题
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
H
Hacker News: Front Page
MyScale Blog
MyScale Blog
P
Palo Alto Networks Blog
G
Google Developers Blog
Google DeepMind News
Google DeepMind News
AI
AI
T
Troy Hunt's Blog
Microsoft Azure Blog
Microsoft Azure Blog
阮一峰的网络日志
阮一峰的网络日志
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Vercel News
Vercel News
Microsoft Security Blog
Microsoft Security Blog
罗磊的独立博客
S
Secure Thoughts
大猫的无限游戏
大猫的无限游戏
博客园 - 叶小钗
人人都是产品经理
人人都是产品经理
Blog — PlanetScale
Blog — PlanetScale
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
S
Security @ Cisco Blogs
Cloudbric
Cloudbric
E
Exploit-DB.com RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - lovecherry

Java避坑宝典《Java业务开发常见错误100例》上线了 招聘前端、Java后端开发、测试、Mysql DBA 我的另一个博客 一个MVC框架的原型 有关网站UI实现的几种方式的讨论 httpmodule和httphandler配合的又一应用——合并脚本样式 - lovecherry - 博客园 如何把ASP.NET TRACE HANDLER的信息持久化保存 .NET 4.0改进(一) 到底怎么样的面试才是最公平的才能找到合适的人又不产生误判 有关CPU占用和缓存的一些见解,希望给大家一些启发 没有linq让我怎么活 ADO.NET EF不方便之处(BUG)收集帖 2005-2008年度个人总结和写书计划? SOA概念误解实施要点 我对SOA的认识以及心得 MCTS Self-Paced Training Kit (Exam 70-503) Microsoft® .NET Framework 3.5—Windows® Communication Foundation 书评 【翻译】微软应用程序架构指南:如何组织应用程序的结构 代朋友发招聘信息,C++程序员 有关写书。。。。。。。。。。。
最近项目的一些心得(纯贴代码)
lovecherry · 2009-07-19 · via 博客园 - lovecherry

唉,眼看着ASP.NET第一步已经出版2年了,这2年貌似自己进步也不是很大,最近完成了一个项目,分享一点代码吧,以后要复制粘贴自己也方便点,因为主要是给自己看的,大家看不懂别见怪。

1、WCF中统一处理异常,并自动包装为 FaultException 返回给客户端:

先建立这么一个ServiceBehavior特性:

    [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
    
public sealed class ErrorHandlingBehaviorAttribute : Attribute, IServiceBehavior
    {
        
#region IServiceBehavior Memberspublic void AddBindingParameters(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
        {
           
        }
public void ApplyDispatchBehavior(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
        {
            IErrorHandler handler 
= new ErrorHandler();foreach (ChannelDispatcher dispatcher in serviceHostBase.ChannelDispatchers)
            {
                dispatcher.ErrorHandlers.Add(handler);
            }
        }
public void Validate(ServiceDescription serviceDescription, System.ServiceModel.ServiceHostBase serviceHostBase)
        {
            
        }
#endregion
    }

然后呢,需要实现啊这么一个自定义的ErrorHandler:

    public class ErrorHandler : IErrorHandler
    {
        
#region IErrorHandler Members
        
        
/// <summary>
        
/// Log exception
        
/// </summary>
        
/// <param name="error"></param>
        
/// <returns></returns>
        public bool HandleError(Exception error)
        {
            
// Ignore communication exception, only log business logic exception
            if (error is CommunicationException)
                
return true;

            Log.LogException(error);

return true;
        }
/// <summary>
        
/// Warp Exception with FaultException
        
/// </summary>
        
/// <param name="error"></param>
        
/// <param name="version"></param>
        
/// <param name="fault"></param>
        public void ProvideFault(Exception error, MessageVersion version, ref Message fault)
        {
            FaultException faultException 
= new FaultException(error.Message);
            MessageFault m 
= faultException.CreateMessageFault();
            fault 
= Message.CreateMessage(version, m, faultException.Action);
        }
#endregion
    }

Log类代码就不写了,爱怎么记录就怎么记录,最后只要把这个特性应用到Service的类上即可。

2、把XML结构转换为span包装的HTML,这样就可以直接为XML的各个层次应用样式啦:

        /// <summary>
        
/// Convert <infs><inf>a</inf><inf>b</inf></infs> to <span class="infs"><span class="inf">a</span><span class="inf">b</span></span>
        
/// </summary>
        
/// <param name="xml"></param>
        
/// <returns></returns>
        public static string ConvertXmlToHtml(this string xml)
        {
            
if (string.IsNullOrEmpty(xml))
                
return string.Empty;

            XElement root 

= XElement.Parse(string.Format("<root>{0}</root>", xml));foreach (var el in root.DescendantsAndSelf())
                el.AddAnnotation(
                    
new XElement("span",
                        
new XElement("ApplyTransforms"),
                        
new XAttribute("class", el.Name)
                    )
                );

            XElement newRoot 

= XForm(root);
            
return newRoot.ToString();
        }

XForm的代码如下:

       private static XElement XForm(XElement source)
        {
            
if (source.Name == "a"return source;if (source.Annotation<XElement>() != null)
            {
                XElement anno 
= source.Annotation<XElement>();
                
return new XElement(anno.Name,
                    anno.Attributes(),
                    anno.Nodes().Select((XNode n) 
=>
                    {
                        XElement annoEl 
= n as XElement;
                        
if (annoEl != null)
                        {
                            
return (object)(source.Nodes().Select((XNode n2) =>
                            {
                                XElement e2 
= n2 as XElement;
                                
if (e2 == null)
                                    
return n2;
                                
else
                                    
return XForm(e2);
                            }));
                        }
                        
else
                            
return n;
                    })
                );
            }
            
else
            {
                
return new XElement(source.Name,
                    source.Attributes(),
                    source.Nodes().Select(n 
=>
                    {
                        XElement el 
= n as XElement;
                        
if (el == null)
                            
return n;
                        
else
                            
return XForm(el);
                    })
                );
            }
        }

3、LINQ TO XML来更新和删除XML:

        /// <summary>
        
/// Remove unwanted embedded translation according to culturecode
        
/// </summary>
        
/// <param name="text"></param>
        
/// <param name="cultureCode"></param>
        
/// <returns></returns>
        public static string RemoveTranslationFromNotePanel(string text, string cultureCode)
        {
            var xml 
= XDocument.Parse(text);
            var translationList 
= from t in xml.Descendants("trans")
                                  select t;
            
if (cultureCode == "cs")
                translationList 
= translationList.Where(t => t.Attribute("lang").Value == "CN");
            
if (cultureCode == "ch")
                translationList 
= translationList.Where(t => t.Attribute("lang").Value == "CNS");
            translationList.Remove();
return xml.ToString();
        }
/// <summary>
        
/// Separate out title in notepanel xml
        
/// </summary>
        
/// <param name="text"></param>
        
/// <param name="title"></param>
        
/// <returns></returns>
        public static string RemoteTitleFromNotePanelAndGetTitle(string text, ref string title)
        {
            var xml 
= XDocument.Parse(text);
            var titleElement 
= (from t in xml.Descendants("title") select t).FirstOrDefault();
            
if (titleElement != null)
            {
                title 
= titleElement.Value;
                titleElement.Remove();
            }
            
return xml.ToString();
        }
/// <summary>
        
/// Handle <gl></gl>,<nondv></nondv> and <x></x> tags
        
/// </summary>
        
/// <param name="text"></param>
        
/// <returns></returns>
        public static string FormatSenseDefinition(string text)
        {
            var xml 
= XDocument.Parse(text);
            
            
// <gl>content here</gl> -> <gl>(= content here)</gl>
            var glTag = (from t in xml.Descendants("gl") select t).ToList();
            glTag.ForEach(gl 
=> gl.Value = string.Format("(= {0})", gl.Value));// <x refurl="guidewordblock_id">content here</x> -> <x refurl="guidewordblock_id"><a title="headword">content here</a></x>
            var xTag = (from t in xml.Descendants("x"where t.Attribute("refurl"!= null select t).ToList();
            
for (int i = 0; i < xTag.Count; i++)
            {
                var x 
= xTag[i];
                
int guidewordID = 0;
                
if (int.TryParse(x.Attribute("refurl").Value, out guidewordID))
                {
                    
if (guidewordID != 0)
                    {
                        var headwordText 
= ContentHelper.GetHeadwordTextFromGuidewordID(guidewordID);
                        
if (!string.IsNullOrEmpty(headwordText))
                        {
                            x.ReplaceAll(
new XElement("a", x.Value, new XAttribute("title", headwordText)));
                        }
                    }
                    
else
                        x.ReplaceAll(
new XElement("a", x.Value, new XAttribute("title", x.Value)));
                }
            }
// <nondv refurl="guidewordblock_id">content here</nondv> -> <nondv refurl="guidewordblock_id"><a title="headword">content here</a></nondv>
            var nondvTag = (from t in xml.Descendants("nondv"where t.Attribute("refurl"!= null select t).ToList();
            
for (int i = 0; i < nondvTag.Count; i++)
            {
                var nondv 
= nondvTag[i];
                
int guidewordID = 0;
                
if (int.TryParse(nondv.Attribute("refurl").Value, out guidewordID))
                {
                    
if (guidewordID != 0)
                    {
                        var headwordText 
= ContentHelper.GetHeadwordTextFromGuidewordID(guidewordID);
                        
if (!string.IsNullOrEmpty(headwordText))
                        {
                            nondv.ReplaceAll(
new XElement("a", nondv.Value, new XAttribute("title", headwordText)));
                        }
                    }
                    
else
                        nondv.ReplaceAll(
new XElement("a", nondv.Value, new XAttribute("title", nondv.Value)));
                }
            };
return xml.ToString();
        }