WCF服务中如何使用IDispatchMessageInspector?我正在尝试在WCF服务实现中使用IDispatchMessageInspector来访问自定义标头值。类似于:publicclassMyService:IMyService{publicListGetNames(){varheaderInspector=newCustomHeaderInspector();//请求和客户端通道来自哪里?varvalues=headerInspector.AfterReceiveRequest(refrequest,clientChannel,OperationContext.Current.InstanceContext);我已经实现了自己的IDispatchMessageInspector类。公共类CustomHeaderInspector:IDispatchMessageInspector{publicobjectAfterReceiveRequest(refMessagerequest,IClientChannelchannel,InstanceContextinstanceContext){varprop=(HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name];varuserName=prop.Headers["用户名"];返回用户名;我如何从服务实现中调用AfterReceiveRequest?编辑:许多类似这篇文章或这篇文章的文章都给出了如何实现您自己的ServiceBehavior的示例。因此,您的服务实现如下所示:[MyCustomBehavior]publicclassMyService:IMyService{publicListGetNames(){//您可以在此处使用“MyCustomBehavior”来访问标头属性吗?所以我可以使用一些有没有办法访问MyCustomBehavior来访问自定义标头值?然后,您必须配置要在WCF堆栈中处理的扩展。该服务本身没有serviceInterceptors的概念,您不必像第一个代码块中那样做。WCF堆栈将为您注入Inspector。MSDN:system.servicemodel.dispatcher.idispatchmessageinspector我正在使用IClientMessageInspector来实现相同的目标。下面是如何从代码中应用它们:varserviceClient=newServiceClientClass(binding,endpointAddress);serviceClient.Endpoint.Behaviors.Add(newMessageInspectorEndpointBehavior());//////表示客户端端点的运行时行为扩展。///publicclassMessageInspectorEndpointBehavior:IEndpointBehaviorwhereT:IClientMessageInspector,new(){//////跨端点实现客户端的修改或扩展。//////要自定义的端点。///要自定义的客户端运行时。publicvoidApplyClientBehavior(ServiceEndpointendpoint,ClientRuntimeclientRuntime){clientRuntime.MessageInspectors.Add(newT());}//////实现在运行时将数据传递给绑定以支持自定义行为。//////要修改的端点。///绑定元素需要支持行为的对象。publicvoidAddBindingParameters(ServiceEndpointendpoint,BindingParameterCollectionbindingParameters){//否此处有特殊之处}//////跨端点实现服务的修改或扩展。//////暴露合约的端点。///要修改或扩展的端点调度程序。publicvoidApplyDispatchBehavior(ServiceEndpointendpoint,EndpointDispatcherendpointDispatcher){//这里没什么特别的}//////实现以确认端点满足某些预期标准。//////要验证的端点。publicvoidValidate(ServiceEndpointendpoint){//Nothingspecialhere}}这里是MessageInspector的演示实例,我用它将客户端版本本传递给服务器,并在自定义头文件中检索服务器版://///表示可以添加到MessageInspectors集合以查看或修改消息的消息检查器对象。///publicclassVersionCheckMessageInspector:IClientMessageInspector{//////在将请求消息发送到服务之前启用对消息的检查或修改。//////要发送到服务的消息。///WCF客户端t对象通道。//////作为///方法的参数返回的对象。///如果没有使用关联状态,则为null。最佳做法是将其设置为a以确保没有两个///对象是相同的。///publicobjectBeforeSendRequest(refMessagerequest,IClientChannelchannel){request.Headers.Add(newVersionMessageHeader());返回空值;}//////在收到回复消息后但在将其传回客户端应用程序之前启用对消息的检查或修改。//////要转换为类型并交还给客户端应用程序的消息。///关联状态数据。publicvoidAfterReceiveReply(refMessagereply,objectcorrelationState){varserverVersion=string.Empty;varidx=reply.Headers.FindHeader(VersionMessageHeader.HeaderName,VersionMessageHeader.HeaderNamespace);如果(idx>=0){varversionReader=reply.Headers.GetReaderAtHeader(idx);while(versionReader.Name!="ServerVersion"&&versionReader.Read()){serverVersion=versionReader.ReadInnerXml();休息;}}验证服务器版本(服务器版本);}privatestaticvoidValidateServerVersion(stringserverVersion){//TODO...}}publicclassVersionMessageHeader:MessageHeader{publicconststringHeaderName="VersionSoapHeader";publicconststringHeaderNamespace="";privateconststringVersionElementName="ClientVersion";publicoverridestringName{get{returnHeaderName;标头命名空间;}}protectedoverridevoidOnWriteHeaderContents(XmlDictionaryWriterwriter,MessageVersionmessageVersion){writer.WriteElementString(VersionElementName,Assembly.GetExecutingAssembly().GetName().Version.ToString());我相信您不需要实现自定义ageIDisp来检索自定义标头,这可以通过以下服务操作方法来完成:varmp=OperationContext.Current.IncomingMessageProperties;var属性=(HttpRequestMessageProperty)mp[HttpRequestMessageProperty.Name];varuserName=property.Headers["用户名"];如果你想中止消息处理,那么实现自定义调度消息检查器是有意义的,例如如果缺少凭据——在这种情况下你可以抛出FaultException但如果你仍然想将值从调度消息检查器传递到服务操作方法——可能它可以通过一些单例与调用标识符(会话ID)一起传递稍后通过该方法或使用wcf扩展提取我做了什么来访问详细信息我在IDispatchMessageInspector.AfterReceiveRequestThread.CurrentPrincipal=newGenericPrincipal(newGenericIdentity(username,"MembershipProvider"),roles)中设置了以下内容;我省略了验证码。要从服务方法访问值,您可以调用Thread.CurrentPrincipal.Identity.Name在您链接到的MSDN页面上,还有一个说明如何插入检查器的说明和一个示例。引用:通常,消息检查器由服务行为、端点行为或契约行为插入。该行为随后将消息检查器添加到DispatchRuntime.MessageInspectors集合。稍后您将获得以下示例:这应该足以让您入门。否则请随时询问:)如果您只想从服务访问标头,您可以尝试OperationContext.Current.IncomingMessageHeaders。以上是C#学习教程:如何在WCF服务中使用IDispatchMessageInspector?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
