Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WCF消息检查器不工作_C#_.net_Wcf_Wcf Extensions - Fatal编程技术网

C# WCF消息检查器不工作

C# WCF消息检查器不工作,c#,.net,wcf,wcf-extensions,C#,.net,Wcf,Wcf Extensions,最近,我正在探索某种方法来记录我的WCF服务处理的任何请求/响应 在此之前,我对跟踪选项有一些不好的经验。现在,我还不知道如何从trace获得实际的响应和请求,我尝试了svctraceviewer工具,但它并没有得到对我有意义的东西。即使如此,跟踪文件还是被破坏了,里面有一些意想不到的字符 大约三四天前,我了解了消息检查器技术。我在我的其他项目中阅读并实现了客户端消息检查器。实际上,我可以看到我的wcf客户端发送的任何请求,以及对该请求的另一方服务响应 我希望做另一方面的日志记录也很容易,例如从

最近,我正在探索某种方法来记录我的WCF服务处理的任何请求/响应

在此之前,我对跟踪选项有一些不好的经验。现在,我还不知道如何从trace获得实际的响应和请求,我尝试了svctraceviewer工具,但它并没有得到对我有意义的东西。即使如此,跟踪文件还是被破坏了,里面有一些意想不到的字符

大约三四天前,我了解了消息检查器技术。我在我的其他项目中阅读并实现了客户端消息检查器。实际上,我可以看到我的wcf客户端发送的任何请求,以及对该请求的另一方服务响应

我希望做另一方面的日志记录也很容易,例如从客户机获取服务请求和服务器响应。但我不喜欢。 详情如下:

public class LogMessageBehavior : IEndpointBehavior
{
    public LogMessageBehavior() 
    { }

    public void AddBindingParameters(ServiceEndpoint endpoint, System.ServiceModel.Channels.BindingParameterCollection bindingParameters) 
    { }

    public void ApplyClientBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime clientRuntime)
    {
        throw new NotImplementedException();
    }

    public void ApplyDispatchBehavior(ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.EndpointDispatcher endpointDispatcher)
    {
        LogMessageInspector inspector = new LogMessageInspector();
        endpointDispatcher.DispatchRuntime.MessageInspectors.Add(inspector);
    }

    public void Validate(ServiceEndpoint endpoint) 
    { 
    }

}

public class LogMessageBehaviorExtensionElement : BehaviorExtensionElement
{
    public LogMessageBehaviorExtensionElement() { }

    public override Type BehaviorType
    {
        get
        {
            return typeof(LogMessageBehavior);
        }
    }

    protected override object CreateBehavior()
    {
        return new LogMessageBehavior();
    }
}

public class LogMessageInspector : IDispatchMessageInspector
{
    object IDispatchMessageInspector.AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
    {
        throw new NotImplementedException();
    }

    void IDispatchMessageInspector.BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
    {
        throw new NotImplementedException();
    }
}
几乎所有的代码都带有NotImplementedException,但我在每个方法和属性上都设置了断点。此外,我会告诉你他们是如何被击中的

App.config

<?xml version="1.0"?>
<configuration>
  <system.serviceModel>
    <extensions>
      <behaviorExtensions>
        <add name="LogMessage" type="MyService.Extensions.LogMessageBehaviorExtensionElement, MyServiceApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
      </behaviorExtensions>
    </extensions>
    <behaviors>     
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="True"/>          
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="LogMessageEndpointBehavior">
          <LogMessage />
        </behavior>
      </endpointBehaviors>
    </behaviors>

    <diagnostics>
      <messageLogging
           logEntireMessage="true"
           logMalformedMessages="true"
           logMessagesAtServiceLevel="true"
           logMessagesAtTransportLevel="true"
           maxMessagesToLog="3000"
           maxSizeOfMessageToLog="20000"/>
    </diagnostics>
    <!-- omitted for brewity -->
    <services>
      <service name="MyService">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/"/>
          </baseAddresses>
        </host>
        <endpoint address="MyServiceAddress" binding="basicHttpBinding" bindingConfiguration="MyService" contract="MyService" name="MyService"  behaviorConfiguration="LogMessageEndpointBehavior">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
      </service>
    </services>

    <bindings>
      <basicHttpBinding>
        <binding name="MyService" closeTimeout="00:01:00"
          openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
          allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
          maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
          messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
          useDefaultWebProxy="true">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="Transport">
            <transport clientCredentialType="None" proxyCredentialType="None"
              realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
       <!-- omitted for brewity -->
      </basicHttpBinding>
    </bindings>
  </system.serviceModel>

  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel.MessageLogging">
        <listeners>
          <add name="messages"
          type="System.Diagnostics.XmlWriterTraceListener"
          initializeData="C:\messages.svclog" />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

</configuration>
服务类没有什么特别的东西

那么,这项工程是如何进行的呢。 如前所述,我在每个方法和属性中设置断点。在我开始调试之后,我们得到了以下顺序的断点命中率:

1. public LogMessageBehaviorExtensionElement() { } 
2. get { return typeof(LogMessageBehavior);  }
3. get { return typeof(LogMessageBehavior);  } (again)
4. get { return typeof(LogMessageBehavior);  } (again)
5. get { return typeof(LogMessageBehavior);  } (again)
好的,让我们尝试发送一些东西到服务,看看它的反应如何。因此,我将使用WSDL生成的一些请求发送到http://localhost:8733/ 并得到有效的响应。我用了SoapUI。在VS中没有任何断点活动!消息检查器不工作。服务方法上的断点命中,表明该方法在没有消息检查器的情况下确实可以工作

此外,我还尝试使用此代码附加行为以相应地设置服务,而不在app.config中指定行为:

ServiceHost myserviceHost = new ServiceHost(typeof(MyService), new Uri(Environment.bindAddress));            
myserviceHost.Open();

foreach (ServiceEndpoint endpoint in myserviceHost.Description.Endpoints)
{
    endpoint.Behaviors.Add(new LogMessageBehavior());
}

Console.WriteLine(myserviceHost.BaseAddresses[0]);
Console.ReadLine();
在这个选项中,我们得到了断点命中的顺序:

1. public LogMessageBehavior() { }
就是这样。并且在向服务发送请求时,也没有任何检查员的活动


那么我如何才能让它工作呢?

尝试在添加行为后打开主机。它应该很好用

ServiceHost myserviceHost = new ServiceHost(typeof(MyService), new Uri(Environment.bindAddress));

foreach (ServiceEndpoint endpoint in myserviceHost.Description.Endpoints)
{
   endpoint.Behaviors.Add(new LogMessageBehavior());
}

myserviceHost.Open();

Console.WriteLine(myserviceHost.BaseAddresses[0]);
Console.ReadLine();

您需要启用和配置。@JohnSaunders我试过了。请查看我的app.config。它会写入损坏的日志,甚至我都不知道如何从中获取具有时间戳的可读消息。至于损坏,您需要强制刷新该文件。停止服务可以做到这一点。对于IIS中托管的服务,我只需触摸web.config-在记事本中打开,键入space,键入backspace,键入Control-S。服务刷新日志并重新启动。如何查看消息流?我试过svctraceviewer,但没有观察到类似的情况:你读过我发布的链接吗?
ServiceHost myserviceHost = new ServiceHost(typeof(MyService), new Uri(Environment.bindAddress));

foreach (ServiceEndpoint endpoint in myserviceHost.Description.Endpoints)
{
   endpoint.Behaviors.Add(new LogMessageBehavior());
}

myserviceHost.Open();

Console.WriteLine(myserviceHost.BaseAddresses[0]);
Console.ReadLine();