| 

.NET C# Java Javascript Exception

4
Ich habe hier einen kleinen, schlanken WCF-Service, der beispielhaft etwa so aussieht:

[ServiceContract]
interface IContentService
{
[OperationContract]
Stream GetContent(string path);
}
...
public class ContentService : IContentService
{
[WebGet(UriTemplate = "base/{*path}")]
public Stream GetContent(string path)
{
//...
}
}
...
WebServiceHost host = new WebServiceHost(typeof(ContentService), GetBaseUrl("content"));
ServiceEndpoint ep = host.AddServiceEndpoint(typeof(IContentService), new WebHttpBinding(), "");
host.Open();

Läuft alles wunderprima. Nun würde ich aber gerne mit .NET-Bordmitteln (! - ich kenne Fiddler, aber das kommt hier nicht in Frage) loggen, was dieser Service so treibt. Insbesondere interessieren mich die HTTP-Header der ein- und ausgehenden Nachrichten. Also schreibe ich in die app.config:

<system.diagnostics>
<sources>
<source name="System.ServiceModel"
switchValue="Information, ActivityTracing"
propagateActivity="true">
<listeners>
<add name="xmlTraceListener" />
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add name="xmlTraceListener" />
</listeners>
</source>
</sources>
<sharedListeners>
<add name="xmlTraceListener"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData= "myApp.svclog" />
</sharedListeners>
</system.diagnostics>

<system.serviceModel>
<diagnostics wmiProviderEnabled="true">
<messageLogging
logEntireMessage="true"
logMalformedMessages="true"
logMessagesAtServiceLevel="true"
logMessagesAtTransportLevel="true"
maxMessagesToLog="10000"
/>
</diagnostics>
</system.serviceModel>

Das liefert mir tatsächlich einen großen Berg an Log-Daten, u.a. auch die HTTP-Header der Requests. Response-seitig hingegen finde ich nur solche Einträge:

<MessageLogTraceRecord Time="2012-02-16T18:39:54.7318548+01:00" Source="ServiceLevelSendReply" Type="System.ServiceModel.Channels.BodyWriterMessage" xmlns="http://schemas.microsoft.com/2004/06/ServiceModel/Management/MessageTrace"></MessageLogTraceRecord>

Das ist mir doch etwas wenig. Wie entlocke ich WCF die HTTP-Header der Response?

Update
OK, manchmal bekomme ich doch auch den Response-Header zu sehen:

  • bei Methoden, die keinen Stream, sondern ein JSON-Objekt zurückgeben (In dem Fall wird auch noch das Objekt selbst mitgeloggt - dass das bei einem Stream nicht geht, ist klar.)
  • bei einer Methode, die zwar einen Stream zurückgibt, den aber als MemoryStream instanziiert

Die "widerspenstigen" Methoden haben alle ein

return File.OpenRead(filePath);

am Ende stehen (das ganze soll als Mini-HTTP-Server funktionieren und tut es ansonsten auch wunderbar). Kann es daran liegen? Ist an dem Vorgehen etwas auszusetzen? Sollte ich den FileStream noch irgendwie wrappen?
16.02.2012
Matthias Hlawatsch 13,2k 4 9
1 Antwort
1
Guten Morgen Matthias,

im MSDN Blog gibt es einen Post WCF Extensibility – Message Inspectors. Sieht auf den ersten Blick recht vielversprechend aus:
"The message inspectors are probably the most used extensibility points of the WCF runtime. Anytime you need to log, inspect, modify or completely replace a message, the two inspector interfaces (IClientMessageInspector for the client side; IDispatchMessageInspector for the server side) are likely to be perfect candidates for the solution."
Meine erste Idee war WCF Routing Services, aber das funktioniert nur für SOAP. Die Inspector Variante scheint aber generell zur Verfügung zu stehen.

Viel Erfolg
Florian
17.02.2012
ffordermaier 8,4k 3 9
Hm, könnte ein Weg sein. Hab inzwischen aber noch ein paar Beobachtungen mehr gemacht (siehe das Update am Ende meiner Frage) und glaube, dass es auch einfacher gehen müßte, bzw. dass möglicherweise an meinem Code etwas nicht ganz in Ordnung ist.
Matthias Hlawatsch 17.02.2012

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH