唉,眼看着ASP.NET第一步已经出版2年了,这2年貌似自己进步也不是很大,最近完成了一个项目,分享一点代码吧,以后要复制粘贴自己也方便点,因为主要是给自己看的,大家看不懂别见怪。
1、WCF中统一处理异常,并自动包装为 FaultException 返回给客户端:
先建立这么一个ServiceBehavior特性:
然后呢,需要实现啊这么一个自定义的ErrorHandler:
Log类代码就不写了,爱怎么记录就怎么记录,最后只要把这个特性应用到Service的类上即可。
2、把XML结构转换为span包装的HTML,这样就可以直接为XML的各个层次应用样式啦:
XForm的代码如下:
3、LINQ TO XML来更新和删除XML:
1、WCF中统一处理异常,并自动包装为 FaultException 返回给客户端:
先建立这么一个ServiceBehavior特性:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->[AttributeUsage(AttributeTargets.Class,AllowMultiple=false,Inherited=false)]
publicsealedclassErrorHandlingBehaviorAttribute:Attribute,IServiceBehavior
{
#regionIServiceBehaviorMembers
publicvoidAddBindingParameters(ServiceDescriptionserviceDescription,System.ServiceModel.ServiceHostBaseserviceHostBase,System.Collections.ObjectModel.Collection<ServiceEndpoint>endpoints,System.ServiceModel.Channels.BindingParameterCollectionbindingParameters)
{
}
publicvoidApplyDispatchBehavior(ServiceDescriptionserviceDescription,System.ServiceModel.ServiceHostBaseserviceHostBase)
{
IErrorHandlerhandler=newErrorHandler();
foreach(ChannelDispatcherdispatcherinserviceHostBase.ChannelDispatchers)
{
dispatcher.ErrorHandlers.Add(handler);
}
}
publicvoidValidate(ServiceDescriptionserviceDescription,System.ServiceModel.ServiceHostBaseserviceHostBase)
{
}
#endregion
}
publicsealedclassErrorHandlingBehaviorAttribute:Attribute,IServiceBehavior
{
#regionIServiceBehaviorMembers
publicvoidAddBindingParameters(ServiceDescriptionserviceDescription,System.ServiceModel.ServiceHostBaseserviceHostBase,System.Collections.ObjectModel.Collection<ServiceEndpoint>endpoints,System.ServiceModel.Channels.BindingParameterCollectionbindingParameters)
{
}
publicvoidApplyDispatchBehavior(ServiceDescriptionserviceDescription,System.ServiceModel.ServiceHostBaseserviceHostBase)
{
IErrorHandlerhandler=newErrorHandler();
foreach(ChannelDispatcherdispatcherinserviceHostBase.ChannelDispatchers)
{
dispatcher.ErrorHandlers.Add(handler);
}
}
publicvoidValidate(ServiceDescriptionserviceDescription,System.ServiceModel.ServiceHostBaseserviceHostBase)
{
}
#endregion
}
然后呢,需要实现啊这么一个自定义的ErrorHandler:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->publicclassErrorHandler:IErrorHandler
{
#regionIErrorHandlerMembers
///<summary>
///Logexception
///</summary>
///<paramname="error"></param>
///<returns></returns>
publicboolHandleError(Exceptionerror)
{
//Ignorecommunicationexception,onlylogbusinesslogicexception
if(errorisCommunicationException)
returntrue;
Log.LogException(error);
returntrue;
}
///<summary>
///WarpExceptionwithFaultException
///</summary>
///<paramname="error"></param>
///<paramname="version"></param>
///<paramname="fault"></param>
publicvoidProvideFault(Exceptionerror,MessageVersionversion,refMessagefault)
{
FaultExceptionfaultException=newFaultException(error.Message);
MessageFaultm=faultException.CreateMessageFault();
fault=Message.CreateMessage(version,m,faultException.Action);
}
#endregion
}
{
#regionIErrorHandlerMembers
///<summary>
///Logexception
///</summary>
///<paramname="error"></param>
///<returns></returns>
publicboolHandleError(Exceptionerror)
{
//Ignorecommunicationexception,onlylogbusinesslogicexception
if(errorisCommunicationException)
returntrue;
Log.LogException(error);
returntrue;
}
///<summary>
///WarpExceptionwithFaultException
///</summary>
///<paramname="error"></param>
///<paramname="version"></param>
///<paramname="fault"></param>
publicvoidProvideFault(Exceptionerror,MessageVersionversion,refMessagefault)
{
FaultExceptionfaultException=newFaultException(error.Message);
MessageFaultm=faultException.CreateMessageFault();
fault=Message.CreateMessage(version,m,faultException.Action);
}
#endregion
}
Log类代码就不写了,爱怎么记录就怎么记录,最后只要把这个特性应用到Service的类上即可。
2、把XML结构转换为span包装的HTML,这样就可以直接为XML的各个层次应用样式啦:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->///<summary>
///Convert<infs><inf>a</inf><inf>b</inf></infs>to<spanclass="infs"><spanclass="inf">a</span><spanclass="inf">b</span></span>
///</summary>
///<paramname="xml"></param>
///<returns></returns>
publicstaticstringConvertXmlToHtml(thisstringxml)
{
if(string.IsNullOrEmpty(xml))
returnstring.Empty;
XElementroot=XElement.Parse(string.Format("<root>{0}</root>",xml));
foreach(varelinroot.DescendantsAndSelf())
el.AddAnnotation(
newXElement("span",
newXElement("ApplyTransforms"),
newXAttribute("class",el.Name)
)
);
XElementnewRoot=XForm(root);
returnnewRoot.ToString();
}
///Convert<infs><inf>a</inf><inf>b</inf></infs>to<spanclass="infs"><spanclass="inf">a</span><spanclass="inf">b</span></span>
///</summary>
///<paramname="xml"></param>
///<returns></returns>
publicstaticstringConvertXmlToHtml(thisstringxml)
{
if(string.IsNullOrEmpty(xml))
returnstring.Empty;
XElementroot=XElement.Parse(string.Format("<root>{0}</root>",xml));
foreach(varelinroot.DescendantsAndSelf())
el.AddAnnotation(
newXElement("span",
newXElement("ApplyTransforms"),
newXAttribute("class",el.Name)
)
);
XElementnewRoot=XForm(root);
returnnewRoot.ToString();
}
XForm的代码如下:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->privatestaticXElementXForm(XElementsource)
{
if(source.Name=="a")returnsource;
if(source.Annotation<XElement>()!=null)
{
XElementanno=source.Annotation<XElement>();
returnnewXElement(anno.Name,
anno.Attributes(),
anno.Nodes().Select((XNoden)=>
{
XElementannoEl=nasXElement;
if(annoEl!=null)
{
return(object)(source.Nodes().Select((XNoden2)=>
{
XElemente2=n2asXElement;
if(e2==null)
returnn2;
else
returnXForm(e2);
}));
}
else
returnn;
})
);
}
else
{
returnnewXElement(source.Name,
source.Attributes(),
source.Nodes().Select(n=>
{
XElementel=nasXElement;
if(el==null)
returnn;
else
returnXForm(el);
})
);
}
}
{
if(source.Name=="a")returnsource;
if(source.Annotation<XElement>()!=null)
{
XElementanno=source.Annotation<XElement>();
returnnewXElement(anno.Name,
anno.Attributes(),
anno.Nodes().Select((XNoden)=>
{
XElementannoEl=nasXElement;
if(annoEl!=null)
{
return(object)(source.Nodes().Select((XNoden2)=>
{
XElemente2=n2asXElement;
if(e2==null)
returnn2;
else
returnXForm(e2);
}));
}
else
returnn;
})
);
}
else
{
returnnewXElement(source.Name,
source.Attributes(),
source.Nodes().Select(n=>
{
XElementel=nasXElement;
if(el==null)
returnn;
else
returnXForm(el);
})
);
}
}
3、LINQ TO XML来更新和删除XML:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->///<summary>
///Removeunwantedembeddedtranslationaccordingtoculturecode
///</summary>
///<paramname="text"></param>
///<paramname="cultureCode"></param>
///<returns></returns>
publicstaticstringRemoveTranslationFromNotePanel(stringtext,stringcultureCode)
{
varxml=XDocument.Parse(text);
vartranslationList=fromtinxml.Descendants("trans")
selectt;
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();
returnxml.ToString();
}
///<summary>
///Separateouttitleinnotepanelxml
///</summary>
///<paramname="text"></param>
///<paramname="title"></param>
///<returns></returns>
publicstaticstringRemoteTitleFromNotePanelAndGetTitle(stringtext,refstringtitle)
{
varxml=XDocument.Parse(text);
vartitleElement=(fromtinxml.Descendants("title")selectt).FirstOrDefault();
if(titleElement!=null)
{
title=titleElement.Value;
titleElement.Remove();
}
returnxml.ToString();
}
///<summary>
///Handle<gl></gl>,<nondv></nondv>and<x></x>tags
///</summary>
///<paramname="text"></param>
///<returns></returns>
publicstaticstringFormatSenseDefinition(stringtext)
{
varxml=XDocument.Parse(text);
//<gl>contenthere</gl>-><gl>(=contenthere)</gl>
varglTag=(fromtinxml.Descendants("gl")selectt).ToList();
glTag.ForEach(gl=>gl.Value=string.Format("(={0})",gl.Value));
//<xrefurl="guidewordblock_id">contenthere</x>-><xrefurl="guidewordblock_id"><atitle="headword">contenthere</a></x>
varxTag=(fromtinxml.Descendants("x")wheret.Attribute("refurl")!=nullselectt).ToList();
for(inti=0;i<xTag.Count;i++)
{
varx=xTag[i];
intguidewordID=0;
if(int.TryParse(x.Attribute("refurl").Value,outguidewordID))
{
if(guidewordID!=0)
{
varheadwordText=ContentHelper.GetHeadwordTextFromGuidewordID(guidewordID);
if(!string.IsNullOrEmpty(headwordText))
{
x.ReplaceAll(newXElement("a",x.Value,newXAttribute("title",headwordText)));
}
}
else
x.ReplaceAll(newXElement("a",x.Value,newXAttribute("title",x.Value)));
}
}
//<nondvrefurl="guidewordblock_id">contenthere</nondv>-><nondvrefurl="guidewordblock_id"><atitle="headword">contenthere</a></nondv>
varnondvTag=(fromtinxml.Descendants("nondv")wheret.Attribute("refurl")!=nullselectt).ToList();
for(inti=0;i<nondvTag.Count;i++)
{
varnondv=nondvTag[i];
intguidewordID=0;
if(int.TryParse(nondv.Attribute("refurl").Value,outguidewordID))
{
if(guidewordID!=0)
{
varheadwordText=ContentHelper.GetHeadwordTextFromGuidewordID(guidewordID);
if(!string.IsNullOrEmpty(headwordText))
{
nondv.ReplaceAll(newXElement("a",nondv.Value,newXAttribute("title",headwordText)));
}
}
else
nondv.ReplaceAll(newXElement("a",nondv.Value,newXAttribute("title",nondv.Value)));
}
};
returnxml.ToString();
}
///Removeunwantedembeddedtranslationaccordingtoculturecode
///</summary>
///<paramname="text"></param>
///<paramname="cultureCode"></param>
///<returns></returns>
publicstaticstringRemoveTranslationFromNotePanel(stringtext,stringcultureCode)
{
varxml=XDocument.Parse(text);
vartranslationList=fromtinxml.Descendants("trans")
selectt;
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();
returnxml.ToString();
}
///<summary>
///Separateouttitleinnotepanelxml
///</summary>
///<paramname="text"></param>
///<paramname="title"></param>
///<returns></returns>
publicstaticstringRemoteTitleFromNotePanelAndGetTitle(stringtext,refstringtitle)
{
varxml=XDocument.Parse(text);
vartitleElement=(fromtinxml.Descendants("title")selectt).FirstOrDefault();
if(titleElement!=null)
{
title=titleElement.Value;
titleElement.Remove();
}
returnxml.ToString();
}
///<summary>
///Handle<gl></gl>,<nondv></nondv>and<x></x>tags
///</summary>
///<paramname="text"></param>
///<returns></returns>
publicstaticstringFormatSenseDefinition(stringtext)
{
varxml=XDocument.Parse(text);
//<gl>contenthere</gl>-><gl>(=contenthere)</gl>
varglTag=(fromtinxml.Descendants("gl")selectt).ToList();
glTag.ForEach(gl=>gl.Value=string.Format("(={0})",gl.Value));
//<xrefurl="guidewordblock_id">contenthere</x>-><xrefurl="guidewordblock_id"><atitle="headword">contenthere</a></x>
varxTag=(fromtinxml.Descendants("x")wheret.Attribute("refurl")!=nullselectt).ToList();
for(inti=0;i<xTag.Count;i++)
{
varx=xTag[i];
intguidewordID=0;
if(int.TryParse(x.Attribute("refurl").Value,outguidewordID))
{
if(guidewordID!=0)
{
varheadwordText=ContentHelper.GetHeadwordTextFromGuidewordID(guidewordID);
if(!string.IsNullOrEmpty(headwordText))
{
x.ReplaceAll(newXElement("a",x.Value,newXAttribute("title",headwordText)));
}
}
else
x.ReplaceAll(newXElement("a",x.Value,newXAttribute("title",x.Value)));
}
}
//<nondvrefurl="guidewordblock_id">contenthere</nondv>-><nondvrefurl="guidewordblock_id"><atitle="headword">contenthere</a></nondv>
varnondvTag=(fromtinxml.Descendants("nondv")wheret.Attribute("refurl")!=nullselectt).ToList();
for(inti=0;i<nondvTag.Count;i++)
{
varnondv=nondvTag[i];
intguidewordID=0;
if(int.TryParse(nondv.Attribute("refurl").Value,outguidewordID))
{
if(guidewordID!=0)
{
varheadwordText=ContentHelper.GetHeadwordTextFromGuidewordID(guidewordID);
if(!string.IsNullOrEmpty(headwordText))
{
nondv.ReplaceAll(newXElement("a",nondv.Value,newXAttribute("title",headwordText)));
}
}
else
nondv.ReplaceAll(newXElement("a",nondv.Value,newXAttribute("title",nondv.Value)));
}
};
returnxml.ToString();
}
本文分享了在ASP.NET项目中使用WCF进行异常统一处理的方法,包括自定义错误处理行为和服务行为特性,以及利用LINQ to XML更新和解析XML内容的技术细节。
2281

被折叠的 条评论
为什么被折叠?



