2012-04-20 4 views
10

몇 가지 방법이있는 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를 어떻게 전송하는지 안다.

+0

WCF에서 기본 제공 추적 기능을 사용할 수없는 이유는 무엇입니까? http://msdn.microsoft.com/en-us/library/ms733025.aspx – DaveRead

+0

@DaveRead 주로 내가 알지 못했던 - 데이터베이스에 내 로그를 저장할 수 있습니까? – Maloric

+0

나만의 것은 아니지만 나만의 TraceListener를 만들 수 있습니다. 자세한 내용은이 문서를 참조하십시오. http://msdn.microsoft.com/en-gb/magazine/cc300790.aspx – DaveRead

답변

19

나는 다른 사람들도 유용 할 수있는 해결책을 발견

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>(); 
    } 

. MessageInspector를 작성하면 다음 당은 "AfterReceiveRequest"와 "BeforeSendReply"이벤트에 코드를 첨부 할 수 있습니다 :

public class MessageInspector : IDispatchMessageInspector 
{ 
    public object AfterReceiveRequest(ref Message request, IClientChannel channel, InstanceContext instanceContext) 
    { 
     MessageBuffer buffer = request.CreateBufferedCopy(Int32.MaxValue); 
     request = buffer.CreateMessage(); 
     LogMessage("Received:\n{0}", buffer.CreateMessage().ToString()); 
     return null; 
    } 

    public void BeforeSendReply(ref Message reply, object correlationState) 
    { 
     MessageBuffer buffer = reply.CreateBufferedCopy(Int32.MaxValue); 
     reply = buffer.CreateMessage(); 
     LogMessage("Sending:\n{0}", buffer.CreateMessage().ToString()); 
    } 
} 

full tutorial for setting up message inspectors fo wcf here 있습니다. app.config/web.config에 비헤이비어 확장을 추가 할 때 정규화 된 어셈블리 이름을 확인하는 데주의를 기울일 것입니다.

다른 사람이 유용하다고 생각하겠습니다.

2

당신이 위 아래 그림과 같이 귀하의 방법을 변경해야 달성하기 위해서는 더 자세한 정보에 대한 Using Message Class

+0

고마워요, 이것은 올바른 방향으로 나를 잡았지만, svcutil.exe를 사용하여 필요한 프록시 클래스를 작성할 때 오류가 발생합니다. 가'WSDL을 가져올 수 없습니다 : binding''WSDL을 가져올 수 없습니다 : binding' ... 등등 는 또한, 내가 요청 본문에서 추가 개체를 검색하는 방법을 잘 모르겠어요 (내 예제는, 하나의 객체를 포함 실제 코드에는 클라이언트를 식별하는 추가 문자열이 있습니다). 월요일에 다시 한 번 살펴 보겠습니다 만, 지금까지 도와 주셔서 감사합니다. – Maloric

2

당신이 사용할 수 있다고 생각합니다.ToString() 방법과 무엇을 할 것 내부적으로 메시지를 다시 쓰는 경우 : ToString() 방법 ... 내부

string soap = OperationContext.Current.RequestContext.RequestMessage.ToString(); 

봐) WCF 서비스 프로젝트를 VS2015에서

0

을, 당신은 웹을 마우스 오른쪽 버튼으로 클릭 수 WCF 구성을 편집하려면 .config를 입력하십시오. 여기에서 진단을 활성화하여 원시 메시지를 기록 할 수 있습니다.

+0

이것에 대해 자세히 설명하고 정확하게 설정하는 방법과 설정을 정확히 지정할 수 있습니까? 단순히이 문장을 작성하는 것만으로는 충분하지 않습니다. –

관련 문제