NServiceBus not deserializing message - json.net

I have a simple sender/receiver setup with NServiceBus
Both sides have:
Newtonsoft.Json (11.0.2)
Newtonsoft.Bson (1.0.1)
NServiceBus.Newtonsoft.Json (2.1.0)
I am getting a the error shown below when NServiceBus tries to deserialize the message
2018-10-01 14:39:47.383 ERROR NServiceBus.RecoverabilityExecutor Moving message 'a687555c-d4be-49dc-acba-a96c00e0d261' to the error queue 'error' because processing failed due to an exception:
NServiceBus.MessageDeserializationException: An error occurred while attempting to extract logical messages from incoming physical message a687555c-d4be-49dc-acba-a96c00e0d261 ---> System.Exception: Could not find metadata for 'Newtonsoft.Json.Linq.JObject'.
Ensure the following:
1. 'Newtonsoft.Json.Linq.JObject' is included in initial scanning.
2. 'Newtonsoft.Json.Linq.JObject' implements either 'IMessage', 'IEvent' or 'ICommand' or alternatively, if you don't want to implement an interface, you can use 'Unobtrusive Mode'.
at NServiceBus.Unicast.Messages.MessageMetadataRegistry.GetMessageMetadata(Type messageType)
at NServiceBus.Pipeline.LogicalMessageFactory.Create(Type messageType, Object message)
at NServiceBus.DeserializeLogicalMessagesConnector.Extract(IncomingMessage physicalMessage)
at NServiceBus.DeserializeLogicalMessagesConnector.ExtractWithExceptionHandling(IncomingMessage message)
I am not really sure what to do to resolve this as its an issue within Newtonsoft by the look of it
Has anyone else encountered this?
Paul

Related

Biztalk 2013 - unconstructed message showing up only when i add the Exception handler

I working on building a simple connection with MS CRM. I am getting this 'Unconstructed message' error only when I add the Exception handler. I referred to another link Use of unconstructed message - which tells that compiler might not be sure of the message being constructed before it is handled.
But I am creating the message in a map(Transform shape) - does that not guarantees that a message is created?
Do I need to add a message assignment shape before the transform and initialize the Request message?
If you are constructing the message inside of the scope to which you have added the exception shape, then that message will be treated as Unconstructed as the exception may occur before or while the transformation occurs.
So no, the transform shape does not guarantee that the message will be constructed at all times.
Usually in this case you are better of using in your exception block the message that is on the initiating receive of your orchestration, or if you are trying to catch an exception after the transformation add a scope that starts after the transform shape and add an exception block to that.

Customizing Error Messages that Elmah Writes To the Database

Entity Framework's DbEntityValidationException renders a message of
Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.
With a stack pointing to where the error occurred. It would be really, really useful if we could dig into the collection of errors, and write out the property and error message. Is there any way in Elmah where we can customize the output for this exception type only?
ELMAH only logs information about an error from the shared stuff on various exception. If the exception message or stacktrace doesnt contain the 'EntityValidationErrors' details, you need to save those yourself.
You can create a filter in ELMAH, implemented to check the type of the exception. If the type is DbEntityValidationException, you can dismiss that exception and raise a new one, containing a ToString of each item in the EntityValidationErrors property as the error detail.

Using Standard WF activities to access a web service - how to set 'expected namespace'?

I am attempting to connect to a .Net 1.0 web service using standard activities in WF 4.0.
I am using the SendandReceiveReplyFactory - the send portion seems to be working - however the ReceiveReplyForSend is for some reason expecting a tempuri.org namespace response rather than the www.thermo.com/informatics/xmlns/limswebservice namespace.
Could anyone instruct me on how I can cause the activity to expect the correct NS.
Thanks in advance for your help.
All the best,
DJ
Error Message:
Workflow Console: Starting Workflow... Send Done Workflow
3fdc4d67-dcac-4092-b34b-9c347acdfe22 Terminated. Exception:
System.ServiceModel.CommunicationException Error in deserializing body
of reply message for operation 'Process'. OperationFormatter
encountered an invalid Message body. Expected to find node type
'Element' with name 'ProcessResponse' and namespace
'http://tempuri.org/'. Found node type 'Element' with name
'ProcessResponse' and namespace
'http://www.thermo.com/informatics/xmlns/limswebservice' Workflow
Console: Workflow Completed
The answer is to specify the namespace in the ServiceContractName Property of the 'Send' Activity using the following syntax '{http://someserver.org/test/}FileService ' in my case '{http://www.thermo.com/informatics/xmlns/limswebservice}LIMSSoap' . The syntax was sensitive to the trailing slash so a little trial and error was needed.
Many thanks to the contributors to WF4 - How to consume external web service? for the answer.

Suspended orchestration service instance re-throwing the same unexpected exception after Resume

I am getting below error, when i am trying to resume Suspended(resumable) orchestration instance.
Scenario: Request went thourgh DB2 Static solicit - Response port, and it got failed because of access permission denied. I can see two instances suspended in the admin console one is related to port and another one is related to orchestration. After fixing the credentials, suspended port instance got resumed but the orchestration one is keep on failing.
Uncaught exception (see the 'inner exception' below) has suspended an instance of service 'Orchestration name'.
The service instance will remain suspended until administratively resumed or terminated.
If resumed the instance will continue from its last persisted state and may re-throw the same unexpected exception.
InstanceId: ca927086-465d-40e8-93fe-c3a0e4c161f7
Shape name:
ShapeId:
Exception thrown from: segment -1, progress -1
Inner exception: An error occurred while processing the message, refer to the details section for more information
Message ID: {96B72521-9833-48EF-BB2F-4A2E2265D697}
Instance ID: {F6FBC912-C9DC-489C-87F3-103FA1273FDC}
Error Description: The user does not have the authority to access the host resource. Check your authentication credentials or contact your system administrator. SQLSTATE: HY000, SQLCODE: -1000
Exception type: XlangSoapException
Source: Microsoft.XLANGs.BizTalk.Engine
Target Site: Void VerifyTransport(Microsoft.XLANGs.Core.Envelope, Int32, Microsoft.XLANGs.Core.Context)
The following is a stack trace that identifies the location where the exception occured
at Microsoft.BizTalk.XLANGs.BTXEngine.BTXPortBase.VerifyTransport(Envelope env, Int32 operationId, Context ctx)
at Microsoft.XLANGs.Core.Subscription.Receive(Segment s, Context ctx, Envelope& env, Boolean topOnly)
at Microsoft.XLANGs.Core.PortBase.GetMessageIdForSubscription(Subscription subscription, Segment currentSegment, Context cxt, Envelope& env, CachedObject location)
at Microsoft.XLANGs.Core.PortBase.GetMessageId(Subscription subscription, Segment currentSegment, Context cxt, Envelope& env, CachedObject location)
at (StopConditions stopOn)
at Microsoft.XLANGs.Core.SegmentScheduler.RunASegment(Segment s, StopConditions stopCond, Exception& exp)
For more information, see Help and Support Center at http://go.microsoft.com/fwlink/events.asp.
Any thoughts how to fix this?
Creating the above scenario using samples:
Go to BizTalk
samples/orchestrations/consumeWebservice
folder, install the
ConsumeWebService application and
publish POWebservice to IIS.
Change IIS Directory security
permissions for POWebservice, remove
anonymous or any other access.
Now drop the message you will see
suspended messages because of HTTP
status 401: Access Denied, then give
access to POWebservice either
anonymous or Windows.
Then resume
the suspended instances, one will
get disappear but
another(orchestration) one wont.
The orchestration will continue to fail with the exception because when it was suspended, the last persistence point was the receipt of the exception. This means that the orchestration will re-start (when resumed) and re-throw the exception.
Here's at article discussing some points at which orchestration state is persisted to the database: http://blogs.msdn.com/b/sanket/archive/2006/11/12/understanding-persistence-points-in-biztalk-orchestration.aspx
You can manipulate this to some extent in your orchestration design, as Richard Seroter discusses here, but generally you would do better to use failed message routing, enabling you to handle the failed messages, and terminate the failed orchestration instance.
Please correct me if I'm wrong, but is this not just normal biztalk behavior? I am not 100% sure so please let me know if this is wrong:
The outbound messaging instance was suspended because the credentials the port was using to connect to to the DB were wrong.
This caused the orchestrations making these calls to also suspend.
The suspended message instance was resumed and was processed correctly because the problem was fixed. So the call was made to the DB.
However, the orchestration instance may not be able to resume because when resumed it found itself at the most recent persistence point and the original error which was delivered back from the send port is still available to the orchestration, causing it to re-suspend.
In the error message, it actually says "If resumed the instance will continue from its last persisted state and may re-throw the same unexpected exception."
If you want to handle this sort of thing you could make the call to the database atomic. That way the orchestration will not persist itself at the point of making the DB call. If the orchestration then suspends it will resume at a point before the DB call is made, and will make the DB call as normal, which should succeed this time because you have fixed the original issue.
The only problem with this is if your DB call cannot be executed more than once with the same data without bad things happenning (is not idempotent).
I am not 100% on the above explaination. Please point out if my understanding is incorrect.
this scenario not treated by Microsoft Biztalk = Middleware FAIL.
you have to solve this at the orchestration design stage up front...
http://seroter.wordpress.com/2007/01/02/orchestration-handling-of-suspended-messages/

Error on deserialization of Array Collection in Flex: RangeError: Error #2006

I am getting this error during serialization:
RangeError: Error #2006: The supplied
index is out of bounds.
The error occurs in AbstractMessage.as when it attempts to read input of timestamp.
After that my fault handler gets this error:
faultCode:Server.Acknowledge.Failed
faultString:'Didn't receive an
acknowledge message' faultDetail:'Was
expecting
mx.messaging.messages.AcknowledgeMessage,
but received null'
It appears to be happening as a result of an ArrayCollection coming back from the server.
Is it necessary to create custom classes to handle serialization of ArrayCollections with custom objects as shown here?
I've also followed the serialization recommendations here with no luck.
Thanks for your help!
The solution was correcting a mistake in writeExternal on the Java side. I was being very careful about the order of serialization but was writing an int as an object using writeObject. This will cause errors in completely unrelated code on the client side after it tries to readInt.
I just experienced this error myself, and it turns out it is caused by the Flash Builder Network monitor being enabled!! FB 4.0.1 this is.
I was going nuts for not finding the reason, so sharing it here for your peace of mind.

Resources