RE: prefix in soap header

by "Ed Giallombardo on 1/29/2008 6:28:00 PM
> Hi,
> I'm trying to call a java web service and i need some help in creating
> a custom SOAP header in c#.
>
> I need to access to a Web service that implements authorization policy,
> by using a session token to be passed in the SOAP header.
>
> The header should be as the following:
>
> <env:Header>
> <cc:sessionContext
> xmlns:cc="http://myServer/XMLSchemas/security2.0/">
> <ticket>14419812551330193201239823092</ticket>
> </cc:sessionContext>
> </env:Header>
>
> I tried to create a custom AuthorizationSOAPHeader class to represent
> the header, but I was not able to define the right tagprefix "cc" for
> the XML root element (sessionContext) and its namespace attribute
> (cc="http://myServer/XMLSchemas/security2.0/"). I also tried to
> manually add the namespace attribute, by overriding the WriteXml method
> provided by the IXmlSerializable interface in the
> AuthorizationSOAPHeader class, but it was not possible to correctly set
> the tag name to "cc:sessionContext", as the ":" character was encoded.
>
> I had to define a custom header class because it isn't defined in the
> wsdl because the soap call is intercepted by a proxy service which
> inspects the header of the request in order to see if the caller can be
> authenticated; then, if the user is authenticated, the request is
> routed to the demanded web service. If the sessionContext node doesn't
> have the cc prefix as described above, the request is rejected.
>
> Is there a way to set the tag prefix for the XMLRootElement of the
> header class( by overriding the WriteXml provided by the
> IXmlSerializable interface ) avoiding the encoding of the colon mark?
> Or the only possible solution is to implement a SOAP extension?
>
> Thank you for any answer.

I too have run into this problem with a customer. The easiest solution I found was to modify the WSDL to include the custom SOAP header. Here is what I ended up with:

1.) Add header parts in the message section to include custom elements:

    &lt part name="request_header1" element="hdr:From"/ &gt

2.)Add header parts to the binding section(input and/or ouput) to include new header part:

       &lt soap:header message="wa:retrieveSoapIn" part="request_header1" use="literal"/&gt

3.)Update Web Reference
4.)In Reference.vb change private variables created to public and then you can assign them in your code through your instance of the proxy class:

ex:
dim WS = new webservice
ws.element1value = "XXX"

This won't create the prefix but it shouldn't be needed because the namespace is included in the xml output(from the hdr prefix)

BizTalk Utilities - Frustration free BizTalk Adapters
http://www.topxml.com/biztalkutilities