PHPFixing
  • Privacy Policy
  • TOS
  • Ask Question
  • Contact Us
  • Home
  • PHP
  • Programming
  • SQL Injection
  • Web3.0

Thursday, May 19, 2022

[FIXED] How are SOAP web service namespaces customized

 May 19, 2022     asp.net-core, soap, soapcore, wcf-data-services, web-services     No comments   

Issue

I'm writing a soap web service in asp.net core using soapcore to replace an existing web service. the caller's request xml cannot change because we intend to minimize change on that side. the current request xml looks like

<soapenv:Envelope
    xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns:ser="http://vendornamespace.com/"
    xmlns:idat="http://schemas.datacontract.org/2004/07/iDataContract">
    <soapenv:Header/>
    <soapenv:Body>
        <ser:ActionRequest>
            <ser:composite>
                <idat:param1>H04</idat:param1>
                <idat:param2>100</idat:param2>
            </ser:composite>
        </ser:PlaceOrder>
    </soapenv:Body>
</soapenv:Envelope>

my web service Interface looks like

public interface INewWebsServices
{
    [OperationContract(Action = "ActionRequest")]
    Task<WebSvcResponseClass> ActionRequest([MessageParameter(Name = "composite")] WebServiceReqactionMethod_A);
}

and my request class looks like

[DataContract (Namespace = "http://schemas.datacontract.org/2004/07/iDataContract", Name ="idat")]
    
[MessageContract()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.datacontract.org/2004/07/iDataContract")]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.datacontract.org/2004/07/iDataContract", IsNullable = false)]
public class WebServiceReq
{
    [MessageBodyMember]
    public string param1 { get; set; }

    [MessageBodyMember]
    public string param2 { get; set; }
}

this generates a web service request :

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:ser="http://vendornamespace.com/">
   <soapenv:Header/>
   <soapenv:Body>
      <ser:PlaceOrder>
         <ser:composite>            
            <ser:param1>?</ser:param1>            
            <ser:param2>?</ser:param2>
         </ser:composite>
      </ser:PlaceOrder>
   </soapenv:Body>
</soapenv:Envelope>

Clearly the idat namespace is missing in the header and is not used in the web request parameters.

How do I modify my WebServiceReq class to include the missing namespace so that SoapCore can de serialize the incoming request properly.


Solution

You can try to define WebSvcResponseClass in a namespace iDataContract, also decorate the properties with [DataMember] and not [MessageBodyMember]. Also, you may define your service interface as

public interface INewWebsServices
{

    [System.ServiceModel.OperationContractAttribute(Action = "http://domain/namespace", ]
        Task<iDataContract.WebSvcResponseClass> WebServiceReqactionMethod_A(iDataContract.WebserviceRequestclass composite); 
}

using the namespace generates idat as prefix in the web service request if you try it using soapUI.



Answered By - Laolu
Answer Checked By - Terry (PHPFixing Volunteer)
  • Share This:  
  •  Facebook
  •  Twitter
  •  Stumble
  •  Digg
Newer Post Older Post Home

0 Comments:

Post a Comment

Note: Only a member of this blog may post a comment.

Total Pageviews

Featured Post

Why Learn PHP Programming

Why Learn PHP Programming A widely-used open source scripting language PHP is one of the most popular programming languages in the world. It...

Subscribe To

Posts
Atom
Posts
Comments
Atom
Comments

Copyright © PHPFixing