몇 가지 방법이있는 WCF 서비스가 있습니다. 어떻게 보내 졌는지에 관계없이 클라이언트에서받은 원시 요청을 기록하고 싶습니다. 한 가지 방법은 내가 사용 로그인 할 수있는 (엄격 레거시 지원을 위해) 쿼리 문자열로 데이터를 받아 들인다 : 그 시나리오에 충분하지만, 다른 방법은 클라이언트가 생성 된 프록시 클래스를 사용하여 XML로 데이터를 전송할 수WCF 서비스에서 원시 요청을 기록하는 방법
OperationContext.Current.IncomingMessageHeaders.To.AbsoluteUri
svcutil.exe에 의해. 몸의 :
OperationContext.Current.RequestContext.RequestMessage
불행하게도, 아무리 내가 읽기 전에 내가 메시지의 버퍼링 된 복사본을 만들 수 없습니다 무엇을하려고이 시나리오에서는 본인은 S에서 원하는 데이터를 발견했다. 이 읽은 때문에
이 메시지는 작업을 지원하지 수 있지만, 나는 다음과 같은 오류가 발생, SendCustomer의 첫 번째 줄에
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
}
예를 들면 다음과 같습니다.
이것은 버퍼링 된 복사본을 만드는 요점입니다. 나는 여기서 내가 뭔가 잘못하고 있다고 생각하고있다.
편집 :
좋아, 그래서 방법은 다음과 같이 지금 :
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);
}
내 문제는 내가 고객을 얻을 ClientKey 별도의 실체로 전송하는 방법을 모른다는 것이다. clientKey를 Customer의 속성으로 만들거나 (특히 데이터를 전달하는 사용자 지정 개체를 만들고 Customer 및 ClientKey를 특성으로 포함하는) 사용자 지정 개체를 만들 수는 있지만 가능하면 피할 수있는 레거시 시스템의 업그레이드이므로 이미이 방법으로 작동합니다.
svcUtil.exe를 사용하여 프록시 클래스를 만드는 데 문제가 있습니다. 위의 메소드 서명을 사용하면 내 서비스가 요청을 보내기 위해 더 이상 올바른 서명을 광고하지 않는다고 가정합니다. 이것이 명확한 지 잘 모르겠다. 만약 나의 유일한 입력 메소드가 Message 객체를 받아들이면, 클라이언트는 Customer와 ClientKey를 어떻게 전송하는지 안다.
WCF에서 기본 제공 추적 기능을 사용할 수없는 이유는 무엇입니까? http://msdn.microsoft.com/en-us/library/ms733025.aspx – DaveRead
@DaveRead 주로 내가 알지 못했던 - 데이터베이스에 내 로그를 저장할 수 있습니까? – Maloric
나만의 것은 아니지만 나만의 TraceListener를 만들 수 있습니다. 자세한 내용은이 문서를 참조하십시오. http://msdn.microsoft.com/en-gb/magazine/cc300790.aspx – DaveRead