最近项目的一些心得(纯贴代码)

本文分享了在ASP.NET项目中使用WCF进行异常统一处理的方法,包括自定义错误处理行为和服务行为特性,以及利用LINQ to XML更新和解析XML内容的技术细节。
唉,眼看着ASP.NET第一步已经出版2年了,这2年貌似自己进步也不是很大,最近完成了一个项目,分享一点代码吧,以后要复制粘贴自己也方便点,因为主要是给自己看的,大家看不懂别见怪。

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
}

然后呢,需要实现啊这么一个自定义的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
}

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();
}

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);
})
);
}
}

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();
}


RocketMQ 中,**分片(Sharding)** 是实现高并发、高可用和可展性的重要机制之一。其核心作用是将消息的存储和消费进行分布式管理,以支持大规模消息处理场景。 ### 分片的作用 1. **提升系统吞吐量** 通过将一个 Topic 的消息分布到多个 Broker 上,每个 Broker 负责一部分消息的存储和转发,从而实现横向展,提高整体系统的吞吐能力。 2. **支持负载均衡** 在消息生产与消费过程中,分片机制使得消息可以均匀分布在多个 Broker 上,生产者和消费者可以并行地处理多个分片,实现负载均衡[^5]。 3. **增强系统可用性与容错性** 每个分片可以配置主从结构(Master-Slave),实现数据复制与故障切换,确保在某个 Broker 故障时仍能保证消息的高可用[^4]。 ### 分片的工作机制 1. **Topic 与 Message Queue 的关系** 在 RocketMQ 中,每个 Topic 会被划分为多个 **Message Queue**(也称为队列或分片),这些队列分布在不同的 Broker 上。例如,一个 Topic 可能有 4 个队列,分别分布在两个 Broker 上,每个 Broker 管理两个队列。 2. **生产者的分片选择** 当生产者发送消息时,会根据一定的策略(如轮询、哈希等)选择一个合适的 Message Queue 进行投递。这一过程称为**生产者负载均衡**。生产者会定期从 NameServer 获取 Topic 的队列分布信息,以保证选择的准确性[^5]。 3. **消费者的分片分配** 消费者组(ConsumerGroup)中的每个消费者实例会负责一部分 Message Queue 的消费任务。这一过程称为**消费者负载均衡**,由 Broker 协调完成,确保每个队列只被一个消费者实例消费,从而避免重复消费和竞争问题。 4. **消息的物理存储** RocketMQ 将所有消息写入统一的 **CommitLog** 文件中,然后通过 **ConsumeQueue** 文件记录每个 Topic 的分片索引信息,实现逻辑分片与物理存储的分离。这种机制保证了写入的高效性和读取的灵活性[^4]。 ### 分片配置与管理 - **创建 Topic 时指定分片数量** 在创建 Topic 时,可以通过命令行或配置文件指定其分片数量(即 Message Queue 数量)。 - **动态容** 可以在不中断服务的情况下,向集群中新增 Broker,并为已有 Topic 增加分片,以应对不断增长的消息量。 ### 示例代码:查看 Topic 分片信息 ```bash # 查看 Topic 的队列分布信息 mqadmin topicRoute -n localhost:9876 -t MyTopic ``` 该命令将输出 Topic `MyTopic` 的路由信息,包括各个 Message Queue 所在的 Broker 地址。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值