Search code examples
c#.netwcfsoapwsdl

Check programatically the version of SOAP(1.1 or 1.2 or both) a WSDL file supports


I m using C# and I want to check which version of SOAP a WSDL is supporting.How can I find this?

WSDL 1.1 File have following namespace in it

xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"

WSDL 1.2 file have following namespace in it

 xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"    

And If a file is supporting both version it can have following type of content in it

<wsdl:binding name="CustServiceSoap" type="tns:CustServiceSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="GetAllCustomers">
      <soap:operation soapAction="http://tempuri.org/GetAllCustomers" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="GetNCustomers">
      <soap:operation soapAction="http://tempuri.org/GetNCustomers" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="GetRangeOfCustomers">
      <soap:operation soapAction="http://tempuri.org/GetRangeOfCustomers" style="document" />
      <wsdl:input>
        <soap:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>


<wsdl:binding name="CustServiceSoap12" type="tns:CustServiceSoap">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="GetAllCustomers">
      <soap12:operation soapAction="http://tempuri.org/GetAllCustomers" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="GetNCustomers">
      <soap12:operation soapAction="http://tempuri.org/GetNCustomers" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
    <wsdl:operation name="GetRangeOfCustomers">
      <soap12:operation soapAction="http://tempuri.org/GetRangeOfCustomers" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>


Solution

  • public void Foo()
    {
        //var uri = new Uri("http://kozhevnikov.com/foo.asmx?WSDL");
        //var uri = new Uri("http://kozhevnikov.com/bar.svc?WSDL");
    
        var importer = new WsdlImporter(new MetadataExchangeClient(uri, MetadataExchangeClientMode.HttpGet).GetMetadata());
        var version = importer.ImportAllEndpoints().Aggregate(Soap.None, (v, e) => v | Parse(e.Binding.MessageVersion.Envelope));
    
        if (version == Soap.None)
            Console.WriteLine("Is None.");
        if (version.HasFlag(Soap.Both))
            Console.WriteLine("Has Both.");
    
        Console.WriteLine(version);
    }
    
    private static Soap Parse(EnvelopeVersion version)
    {
        if (version == EnvelopeVersion.None)
            return Soap.None;
        if (version == EnvelopeVersion.Soap11)
            return Soap.Soap11;
        if (version == EnvelopeVersion.Soap12)
            return Soap.Soap12;
        throw new NotImplementedException(version.ToString());
    }
    
    public enum Soap
    {
        None,
        Soap11,
        Soap12,
        Both = Soap11 | Soap12
    }