对于一个经验丰富的编程人员来说,它不可能不知道WCF为何物。作为一个.NET Framework 3.5的重要组成部件,为我们带来了非常大的好处。我们在这里先来了解一下WCF使用Header的相关应用技巧。
在WCF中如何实现登陆,典型的场景如下:
- [ServiceContract]
- public interface ILogin {
- [OperationContract]
- bool Signin(string userName, string password);
- }
- [ServiceContract]
- public interface IBizTest {
- [OperationContract]
- string GetWelcomeInfo();
- }
千万别从WCF自带的那个InstanceContextMode来想办法,因为WCF中的PerSession调用只是针对每个服务类而言的,除非你变态到服务端只有一个类来实现全部的接口;#t#
变个思路,能不能用类似.NET Remoting中的CallContext呢?但是查了一下WCF的手册,好像也没有这么个东西,怎么解决呢?那就是Custom header.
解决方案提出前,需要知道一点的就是,服务端取客户端送出的Header的方法:
先遍历OperationContext.Current.IncomingMessageHeaders找出客户端发送的Header Name,然后再用 OperationContext.Current.IncomingMessageHeaders.GetHeader
下面的问题就剩下客户端怎么发送Custom Header了。
策略1:在每个客户端Proxy中增加类似如下的代码
- using (OperationContextScope scope = new
OperationContextScope(InnerChannel)) {- MessageHeader mh = MessageHeader.CreateHeader("HeaderName",
string.Empty, "HeaderValue");- OperationContext.Current.OutgoingMessageHeaders.Add(mh);
- //…
- }
但是每个客户端都要增加,这样的WCF使用Header的步骤太麻烦了,所以,引出
2.自定义一个CallContextAttribute,代码如下:
1. 先定义一个IClientMessageInspector接口的实现类
- public class ContextHeader : IClientMessageInspector {
- public void AfterReceiveReply(ref System.ServiceModel.
Channels.Message reply, object correlationState) {- //
- }
- public object BeforeSendRequest(ref System.ServiceModel.
Channels.Message request, IClientChannel channel) {- MessageHeader clientHeader = MessageHeader.CreateHeader
("headerName", string.Empty, "headerValue");- request.Headers.Add(clientHeader);
- return null;
- }
- }
OK , 然后就可以实现CallContextAttribute了
- public class CallContextAttribute : Attribute, IEndpointBehavior,
IOperationBehavior {- IEndpointBehavior Members#region IEndpointBehavior Members
- public void AddBindingParameters(ServiceEndpoint endpoint,
BindingParameterCollection bindingParameters) {- }
- public void ApplyClientBehavior(ServiceEndpoint endpoint,
ClientRuntime clientRuntime) {- clientRuntime.MessageInspectors.Add(new ContextHeader());
- }
- public void ApplyDispatchBehavior(ServiceEndpoint endpoint,
EndpointDispatcher endpointDispatcher) {- }
- public void Validate(ServiceEndpoint endpoint) {
- }
- #endregion
- IOperationBehavior Members#region IOperationBehavior Members
- public void AddBindingParameters(OperationDescription operationDescription,
BindingParameterCollection bindingParameters) {- }
- public void ApplyClientBehavior(OperationDescription operationDescription,
ClientOperation clientOperation) {- clientOperation.Parent.MessageInspectors.Add(new ContextHeader ());
- }
- public void ApplyDispatchBehavior(OperationDescription operationDescription,
DispatchOperation dispatchOperation) {- }
- public void Validate(OperationDescription operationDescription) {
- }
- #endregion
- }
完工大吉,***在我们Contract中加入CallContextAttribute就可以啦,客户端不用增加任何代码了。
- [ServiceContract]
- [CallContext]
- public interface IBizTest {
- [OperationContract]
- [CallContext]
- string GetWelcomeInfo();
- }
以上就是我们为大家介绍的WCF使用Header的相关操作方法。
文章名称:WCF使用Header如何正确实现
网站网址:http://www.csdahua.cn/qtweb/news43/432443.html
网站建设、网络推广公司-快上网,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 快上网