microsoft / ApplicationInsights-SDK-Labs

Application Insights experimental projects repository
MIT License
61 stars 48 forks source link

Getting System.NullReferenceException #45

Open rahulrajatsingh opened 8 years ago

rahulrajatsingh commented 8 years ago

I just added this package to my service and tested it. I am getting following exception just by adding this package dependency.

System.NullReferenceException: Object reference not set to an instance of an object. at Microsoft.ApplicationInsights.Wcf.Implementation.WcfOperationContext.DiscoverOperationName(OperationContext operationContext) at Microsoft.ApplicationInsights.Wcf.Implementation.WcfOperationContext..ctor(OperationContext operationContext) at Microsoft.ApplicationInsights.Wcf.Implementation.WcfOperationContext.GetContext() at Microsoft.ApplicationInsights.Wcf.Implementation.WcfInterceptor.BeforeSendReply(Message& reply, Object correlationState) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.BeforeSendReplyCore(MessageRpc& rpc, Exception& exception, Boolean& thereIsAnUnhandledException)

tomasr commented 8 years ago

@rahulrajatsingh Could you tells us a little information?

From the stack trace, it looks like the exception is coming up when processing the response message generated by the service... it's not finding the same OperationContext as the one that was present when the request message came in, so likely the context is in the wrong state to look up the necessary information.

tomasr commented 8 years ago

OK, found one possible repro scenario: This same exception will happen if the service operation that was called explicitly or implicitly ends up calling another remote service.

However, it will only happen if the calling code instantiates a new OperationContextScope and does not dispose it correctly, so something like this:

var channel = new SomeServiceClient();
// the following line should be in a using statement
var scope = new OperationContextScope((IContextChannel)channel);
// use OperationContext for something
OperationContext.Current.OutgoingMessageHeaders.Add(new SomeCustomHeader());

// call service
channel.CallSomeOperation();

Code like this causes the OperationContext for the child call to be stuck on the current thread, so when we look at OperationContext.Current later on, we're getting the wrong context.

rahulrajatsingh commented 8 years ago

Please find all the requested details below:

What .NET Version is your code compiled for, and what .NET Framework version is it running no?

4.5.1

Are you using duplex contracts?

No

Does your service code manipulate OperationContext in any way during the operation execution?

Yes we are pushing claims in the OutgoingMessageHeaders for other service calls.

What behaviors are you enabling on your service?

No custom behavior. Its configured to use Single instance with Concurrency mode as Multiple and some throttling using configurations.

tomasr commented 8 years ago

@rahulrajatsingh Can you confirm if your code suffers by any chance of the issue mentioned above of not disposing correctly the OperationContextScope object?

Also, version 0.26.0-build14298 was published yesterday with a workaround for this. Can you try it and let us know if it resolves the issue for you?