我们都知道WCF是微软的最新通讯模块,对WebService支持特别好,但现在我想截取客户端的申请内容,比如连接会话,(类似“System.Net.HttpListenerContext)”,客户端发送的申请内容(类似“System.Net.HttpListenerRequest“)。并且能够阻断Context,能修改Request  
谢谢。  

解决方案 »

  1.   

    可行
    WebService 本来就是通过 HTTP 明文传输的
    除非用了 SSL
    不然都能截出来
      

  2.   

    别问我的中文ID行吗(^_^)每次我发帖子都有人问我这个。N年前申请的,那时能用中文
      

  3.   

    RE:vengair(韦恩) 
    怎么个截法;在微软的社区中也没有人知道。
      

  4.   

    Altering the SOAP Message Using SOAP Extensions
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpconalteringsoapmessageusingsoapextensions.asp
      

  5.   

    RE:vengair(韦恩) 谢谢您的关注;但这个好像时2.0中对XMLWebervice的说明文档,好像不是对WCF的。
      

  6.   

    文章本身的确不是WCF的
    不过对于的需求似乎有些类似的地方
    "Altering" the SOAP Message Using SOAP Extensions
      

  7.   

    原理我知道,在2.0中我已经能处理了,就不知道WCF怎么办,急啊。
      

  8.   

    用工具吧;记得《WCF服务编程》提到过这个工具,好像是负载均衡用的 ,忘了名称了,回头帮你查查;
      

  9.   

    你这个问题可以抽象为拦截调用(这也是AOP的前提),msdn里已经有叙述了。
    以前很多人都用ContextBoundObject个来实现拦截、修改调用请求,现在wcf都帮你做好了,具体做法如下(只解释怎么做service拦截):实现一个IServiceBehavior接口,在应用behavior的时候添加拦截器(ApplyDispatchBehavior方法):
    public class Behavior : IServiceBehavior
    {
            public void AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, Collection<ServiceEndpoint> endpoints, BindingParameterCollection bindingParameters)
            {
                return null;        
            }        public void ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
            {
                foreach (ChannelDispatcher chDisp in serviceHostBase.ChannelDispatchers)
                {
                    foreach (EndpointDispatcher enDisp in chDisp.Endpoints)
                    {
                        //此处service拦截器,不是必须添加
                        //enDisp.DispatchRuntime.MessageInspectors.Add(new Inspector());
                        
                        //为每个operationt添加拦截器
                        foreach (DispatchOperation op in enDisp.DispatchRuntime.Operations)
                        {
                            op.ParameterInspectors.Add(new Inspector());
                        }
                    }
                }
            }        public void Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
            {
                return null;
            }
    }为配置文件的behavior节增加一个扩展元素(实现抽象类BehaviorExtensionElement):
    public class BehaviorElement : BehaviorExtensionElement 
    {
            public override Type BehaviorType
            {
                get { return typeof(MyBehavior); }
            }        protected override object CreateBehavior()
            {
                return new MyBehavior(InspectorType);
            }
    }定义拦截类(实现IParameterInspector,如果是需要对service所有消息进行拦截还需实现IDispatchMessageInspector)
        public class Inspector : IParameterInspector
        {
            public Inspector()
            {
            }        #region IParameterInspector Members        public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
            {
                Console.WriteLine("after call");
            }        public object BeforeCall(string operationName, object[] inputs)
            {
                Console.WriteLine("before call");
                return null;
            }        #endregion
        }
    修改配置文件,为service指定自定义的behavior
     <system.serviceModel>
        <extensions>
          <behaviorExtensions>
            <add name="Behavior" type="Behavior.BehaviorElement, Behavior, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
          </behaviorExtensions>
        </extensions>
        <services>
          <service behaviorConfiguration="MyBehavior" name="xxxx">
            <endpoint address="xxxxxx"
              binding="xxxxx" bindingConfiguration="xxxx"
              name="xxxx" contract="xxxxxx" />
          </service>
        </services>
        <behaviors>
          <serviceBehaviors>
            <behavior name="Behavior">
              <Behavior/>
            </behavior>
          </serviceBehaviors>
        </behaviors>
     </system.serviceModel>启动后客户端所有请求都会被自定义的behavior先拦截掉,并可以按情况修改。
      

  10.   

    配置文件这里有个地方有错误
    <service behaviorConfiguration="MyBehavior" name="xxxx"> 
             <endpoint address="xxxxxx" 
              binding="xxxxx" bindingConfiguration="xxxx" 
              name="xxxx" contract="xxxxxx" />
    应为
    <service behaviorConfiguration="Behavior" name="xxxx"> 
             <endpoint address="xxxxxx" 
              binding="xxxxx" bindingConfiguration="xxxx" 
              name="xxxx" contract="xxxxxx" />
      

  11.   

    代码是我一个工程的片断,为了更明确说明问题贴上来的时候做了改动,BehaviorElement的实现还是贴错了,修正为
    public class BehaviorElement : BehaviorExtensionElement  

            public override Type BehaviorType 
            { 
                get { return typeof(Behavior); } 
            }         protected override object CreateBehavior() 
            { 
                return new Behavior(); 
            }