Mam usługę WCF z kilkoma metodami. Chciałbym zalogować surowe żądanie, które pochodzi od klienta, niezależnie od tego, jak został wysłany. Jedną z metod akceptuje dane jako kwerendy (ściśle wsparcia starszego typu), które mogę się zalogować przy użyciu:Sposób rejestrowania żądania surowego w usłudze WCF
OperationContext.Current.IncomingMessageHeaders.To.AbsoluteUri
To wystarczy w tym scenariuszu, ale inne metody pozwalają klientowi na wysyłanie danych w formacie XML przy użyciu klasy proxy generowanej przez svcutil.exe. W tym scenariuszu znalazłem dane Chcę w sekund: obudowa:
OperationContext.Current.RequestContext.RequestMessage
Niestety, bez względu na to, co próbuję Nie mogę utworzyć buforowany kopię wiadomości przed jej czytać. Oto przykład:
public CascadeResponse SendCustomer(Customer c)
{
Message msg = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(Int32.MaxValue).CreateMessage();
LogMessage(msg);
// Now that the request is logged, get on with the rest
}
Na pierwszej linii SendCustomer jednak, pojawia się następujący błąd:
Ta wiadomość nie może wspierać działania, ponieważ została przeczytana.
Na tym polega przede mną tworzenie buforowanej kopii? Zgaduję, że robię tutaj coś bardzo złego.
Edit:
Ok, więc metoda ta jest obecnie tak:
public CascadeResponse SendCustomer(Message requestMessage)
{
Message msg = OperationContext.Current.RequestContext.RequestMessage.CreateBufferedCopy(Int32.MaxValue).CreateMessage();
LogMessage(msg);
// Now that the request is logged, get on with the rest
Customer c = msg.GetBody<Customer>();
string clientKey = "1111"; // This should be the clientKey string passed to the function along with the customer
return SendLead(c, clientKey);
}
Moim problemem jest to, że nie wiem, jak zdobyć klienta i ClientKey wysyłane jako osobne podmioty. Mógłbym uczynić clientKey własnością Klienta (lub utworzyć niestandardowy obiekt, który jest przeznaczony specjalnie do przekazywania danych i zawiera Customer i ClientKey jako atrybuty), ale chciałbym tego uniknąć, jeśli to możliwe, ponieważ jest to aktualizacja starszego systemu, który już działa w ten sposób.
Mam również problemy z używaniem svcUtil.exe do tworzenia moich klas proxy - Zakładam, że posiadanie powyższego podpisu metody oznacza, że moja usługa nie będzie już reklamować poprawnego podpisu, aby wysyłać żądania jako? Nie jestem pewien, czy to wystarczająco jasne - jeśli moja metoda wprowadzania tylko akceptuje obiekt wiadomości, w jaki sposób mój klient wie, aby wysłać klienta i klucz klienta?
Każdy powód, dla którego nie można korzystać z wbudowanej funkcji śledzenia w WCF? http://msdn.microsoft.com/en-us/library/ms733025.aspx – DaveRead
@DaveRead Głównie o tym nie wiedziałem - czy pozwala mi to zapisywać logi do bazy danych? – Maloric
Nie po wyjęciu z pudełka, ale możesz utworzyć własny niestandardowy program TraceListener, zobacz ten artykuł, aby uzyskać szczegółowe informacje: http://msdn.microsoft.com/en-gb/magazine/cc300790.aspx – DaveRead