以编程方式检查WSDL文件支持的SOAP(1.1或1.2或两者)版本

时间:2012-04-11 05:14:06

标签: c# .net wcf soap wsdl

我正在使用C#,我想检查WSDL支持哪个版本的SOAP。我怎样才能找到它?

WSDL 1.1文件中包含以下命名空间

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

WSDL 1.2文件中包含以下命名空间

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

如果一个文件支持这两个版本,它可以在其中包含以下类型的内容

<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>

1 个答案:

答案 0 :(得分:0)

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
}