Aus den Kommentaren gefragt, wie Sie tun dies mit IParameterInspector getan werden könnte. Der Operationsname ist Teil der Before/AfterCall-Methode.
Nur zu meinen Kommentaren hinzufügen, welchen Inspektor zu verwenden. Von Carlos Figueira's blogs:
Die Nachrichteninspektoren, in der früheren Post dieser Serie beschrieben, ermöglicht Ihnen die vollständige Kontrolle über die Nachricht über den Stapel WCF gehen. Sie sind sehr mächtig, aber Sie müssen wissen, wie man mit dem Nachrichtenobjekt umgeht, was nicht der wünschenswerteste Weg der Programmierung ist. Wenn das Servicemodell in WCF das gesamte Messaging-Framework ausblendet, indem es uns erlaubt, unsere Services in Form von stark typisierten Operationen zu definieren (dh nice primitive und benutzerdefinierte -Typen), sollte es eine Möglichkeit geben, Anfragen/Antworten abzufangen nach alle die Verarbeitung, um diese Parameter von eingehenden Nachrichten zu extrahieren (oder bevor sie in ausgehenden Nachrichten verpackt sind) ist fertig. Der IParameterInspector ist genau das - vor und nach jedem Anruf, der Inspektor bekommt eine Chance, die Operation Eingänge, Ausgänge und Rückgabewert, in den gleichen Typen wie durch den Vorgang definiert Vertrag, keine Konvertierung benötigt (die einzige Sache benötigt wird ein Cast, da die Parameter als Objekte übergeben werden).
Dies ist ein vollständiges Kommandozeilen-Programm, das zeigt:
using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
namespace WCFClientInspector
{
public class OperationLogger : IParameterInspector
{
public void AfterCall(string operationName, object[] outputs, object returnValue, object correlationState)
{
Console.WriteLine("Completed operation:" + operationName);
}
public object BeforeCall(string operationName, object[] inputs)
{
Console.WriteLine("Calling operation:" + operationName);
return null;
}
}
public class OperationLoggerEndpointBehavior : IEndpointBehavior
{
public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters)
{
}
public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
{
foreach (ClientOperation operation in clientRuntime.ClientOperations)
{
operation.ClientParameterInspectors.Add(new OperationLogger());
}
}
public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher)
{
}
public void Validate(ServiceEndpoint endpoint)
{
}
}
[ServiceContract]
public interface ISimple
{
[OperationContract]
void DoSomthing(string s);
}
public class SimpleService : ISimple
{
public void DoSomthing(string s)
{
Console.WriteLine("Called:" + s);
}
}
public static class AttributesAndContext
{
static void Main(string[] args)
{
ServiceHost simpleHost = new ServiceHost(typeof(SimpleService), new Uri("http://localhost/Simple"));
simpleHost.Open();
ChannelFactory<ISimple> factory = new ChannelFactory<ISimple>(simpleHost.Description.Endpoints[0]);
factory.Endpoint.EndpointBehaviors.Add(new OperationLoggerEndpointBehavior());
ISimple proxy = factory.CreateChannel();
proxy.DoSomthing("hi");
Console.WriteLine("Press ENTER to close the host.");
Console.ReadLine();
((ICommunicationObject)proxy).Shutdown();
simpleHost.Shutdown();
}
}
public static class Extensions
{
static public void Shutdown(this ICommunicationObject obj)
{
try
{
obj.Close();
}
catch (Exception ex)
{
Console.WriteLine("Shutdown exception: {0}", ex.Message);
obj.Abort();
}
}
}
}
er den Ausgang geben soll:
Calling operation:DoSomthing
Called:hi
Completed operation:DoSomthing
Press ENTER to close the host.
hart dafür ist, dass Sie so niedrig, in dem Client-Stack sind, dass die Informationen Sie müssen wirklich in das Nachrichtenobjekt eingewickelt werden. Hast du eine Chance, einen anderen Inspektor zu benutzen? Zum Beispiel wird ein IParameterInspector pro Operation angewendet und ist daher geradlinig. Es würde Ihnen auch erlauben, spezifische Lösungen wie HTTPOperationName nicht zu binden. – ErnieL
Wie würde Parameter Inspector arbeiten? –