开发者

Controlling WCF Message Body serialization

开发者 https://www.devze.com 2023-01-30 13:22 出处:网络
I need to create a WCF service that will emulate some third-party service. That service has very complicated messages and wrappers for them, so I will simplify them in description.

I need to create a WCF service that will emulate some third-party service. That service has very complicated messages and wrappers for them, so I will simplify them in description.

I have WSDL of that service and created proxy class. But here the first problem occurs: all methods in proxy have

[System.ServiceModel.OperationContractAttribute(Action = "", ReplyAction = "*")] So it is impossible to create WCF service with many methods: each for one method in proxy because every method must have unique Action. I think that third-party service has one method that handles all requests. And I created such method with needed KnownType attributes on RequestTypeBase and ResponceTypeBase. All proxy-class methods have one parameter of type, derived from RequestTypeBase. And here is the main problem and question: when WCF service tries to deserialize message body, it throws an exception saying that expected elementName is "Process" (the name of my mega-method that processes all requests) but existing elementName is "RequestType1" (the name class with data that must be passed to "Process" method as parameter). So how can I receive such message?? Is there some attribute in WCF to not require the methodName as root of Message body? And I even not understand for what does WCF need that MethodName there if he already knows what method is called? Looks like redundancy with action specification.

Maybe simple MessabeBody example that is successfully processing by WCF, will help to understand what I mean:

<s:Body>
  <TestMethod xmlns="someNa开发者_Python百科mespace">
    <x>1</x>
    <str>param2</str>
  </TestMethod>
</s:Body>


You could skip WCF deserialization completely on the service side by using the "universal service contract":

[ServiceContract]
public interface IUniversalRequestResponseContract
{
    [OperationContract(Action="*", ReplyAction="*")]
    Message ProcessMessage(Message msg);
}

and then handle deserialization yourself working with the Message instance received.

If you are writing a stub emulation of some external service for testing purposes (I'm guessing), that is a good approach anyway because you can control exactly what is sent in the response.

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号