Sam
Sam

Reputation: 51

How to consume an ASP.net webservice and WCF webservice using a common Reference

I a writing a C# console application that has to consume ASP.net webservice and WCF service using a common proxy. The WCF and ASP.net webservice will implement same data and service contract and same namespace. I need to know how it can be achieved.

Thanks in advance for your suggestions and inputs.

@Pertu Thanks for the input , I am using the same approach however the same consumer is unable to call both the services. Below is the code snapshot

======= Proxy used by Consumer to call webservices==========

[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.1")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name="BaseServiceSoap", 
Namespace="http://tempuri.org/")]

public partial class BaseService : System.Web.Services.Protocols.SoapHttpClientProtocol 
{

private System.Threading.SendOrPostCallback GetWeightOperationCompleted;

/// <remarks/>
public BaseService()
{
    this.Url = "http://localhost:53899/BaseService.asmx";
}
......

======== Consumer Code
//Below call to ASP.NEt webservice succeeds 

BaseService typeACalculator = new BaseService();
typeACalculator.Url = "http://localhost:54106/TypeA.asmx";
Console.WriteLine("Article for type A weighs: " +
    typeACalculator.GetWeight(articleForCalcA).ToString());

//Below call to WCF fails

BaseService WCFCalculator = new BaseService();

WCFCalculator.Url = "http://localhost:52224/TypeWCF35Calc.svc";
Console.WriteLine("Article for type WCF weighs: " +
    WCFCalculator.GetWeight(articleForCalcB).ToString());
Console.ReadKey();

======== Contract in WCF===============

 [ServiceContract]
 public interface IBaseServiceSoap 
 {
   [OperationContract]
    double GetWeight(Article article);
 }

====== Contract in ASP.NEt webservice================
/// <remarks/>


  [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.1")]
  [System.Web.Services.WebServiceBindingAttribute(Name="BaseServiceSoap", 
    Namespace="http://tempuri.org/")]
  public interface IBaseServiceSoap 
  {

   /// <remarks/>
   [System.Web.Services.WebMethodAttribute()]
   [System.Web.Services.Protocols.SoapDocumentMethodAttribute  
   ("http://tempuri.org/GetWeight",     
   RequestNamespace="http://tempuri.org/", ResponseNamespace="http://tempuri.org/",  
   Use=System.Web.Services.Description.SoapBindingUse.Literal, 
   ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)]

   double GetWeight(Article article);
  }    

Hmm, Had been on the road for sometime .... Here are the wsdls

===WSDL of ASMX webservice ==== created using WSDL.exe

<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" 
 xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
 xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" 
 xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
 xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" 
 xmlns:s="http://www.w3.org/2001/XMLSchema" 
 xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://tempuri.org/" 
 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
      <s:element name="GetWeight">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="article" type="tns:Article" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:complexType name="Article">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="1" name="Id" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="Characteristics" 
           type="tns:ArticleCharacteristics" />
        </s:sequence>
      </s:complexType>
      <s:complexType name="ArticleCharacteristics">
        <s:sequence>
          <s:element minOccurs="1" maxOccurs="1" name="Length" type="s:double" />
          <s:element minOccurs="1" maxOccurs="1" name="Height" type="s:double" />
          <s:element minOccurs="1" maxOccurs="1" name="Width" type="s:double" />
          <s:element minOccurs="1" maxOccurs="1" name="Weight" type="s:double" />
        </s:sequence>
      </s:complexType>
      <s:element name="GetWeightResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="GetWeightResult" type="s:double" />
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:schema>
  </wsdl:types>
  <wsdl:message name="GetWeightSoapIn">
    <wsdl:part name="parameters" element="tns:GetWeight" />
  </wsdl:message>
  <wsdl:message name="GetWeightSoapOut">
    <wsdl:part name="parameters" element="tns:GetWeightResponse" />
  </wsdl:message>
  <wsdl:portType name="BaseServiceSoap">
    <wsdl:operation name="GetWeight">
      <wsdl:input message="tns:GetWeightSoapIn" />
      <wsdl:output message="tns:GetWeightSoapOut" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="BaseServiceSoap" type="tns:BaseServiceSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="GetWeight">
      <soap:operation soapAction="http://tempuri.org/GetWeight" 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="BaseServiceSoap1" type="tns:BaseServiceSoap">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="GetWeight">
      <soap12:operation soapAction="http://tempuri.org/GetWeight" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="TypeA">
    <wsdl:port name="BaseServiceSoap" binding="tns:BaseServiceSoap">
      <soap:address location="http://localhost:54106/TypeA.asmx" />
    </wsdl:port>
    <wsdl:port name="BaseServiceSoap1" binding="tns:BaseServiceSoap1">
      <soap12:address location="http://localhost:54106/TypeA.asmx" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

===== WSDL of WCF webservice, generated after configuring the WCF webservice===
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:http="http://schemas.xmlsoap.org/wsdl/http/"  
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" 
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" 
xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" 
xmlns:s="http://www.w3.org/2001/XMLSchema" 
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" targetNamespace="http://tempuri.org/" 
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
  <wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
      <s:element name="GetWeight">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="0" maxOccurs="1" name="article" type="tns:Article" />
          </s:sequence>
        </s:complexType>
      </s:element>
      <s:complexType name="Article">
        <s:sequence>
          <s:element minOccurs="0" maxOccurs="1" name="Id" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="Name" type="s:string" />
          <s:element minOccurs="0" maxOccurs="1" name="Characteristics"  
           type="tns:ArticleCharacteristics" />
        </s:sequence>
      </s:complexType>
      <s:complexType name="ArticleCharacteristics">
        <s:sequence>
          <s:element minOccurs="1" maxOccurs="1" name="Length" type="s:double" />
          <s:element minOccurs="1" maxOccurs="1" name="Height" type="s:double" />
          <s:element minOccurs="1" maxOccurs="1" name="Width" type="s:double" />
          <s:element minOccurs="1" maxOccurs="1" name="Weight" type="s:double" />
        </s:sequence>
      </s:complexType>
      <s:element name="GetWeightResponse">
        <s:complexType>
          <s:sequence>
            <s:element minOccurs="1" maxOccurs="1" name="GetWeightResult" type="s:double" />
          </s:sequence>
        </s:complexType>
      </s:element>
    </s:schema>
  </wsdl:types>
  <wsdl:message name="GetWeightSoapIn">
    <wsdl:part name="parameters" element="tns:GetWeight" />
  </wsdl:message>
  <wsdl:message name="GetWeightSoapOut">
    <wsdl:part name="parameters" element="tns:GetWeightResponse" />
  </wsdl:message>
  <wsdl:portType name="BaseServiceSoap">
    <wsdl:operation name="GetWeight">
      <wsdl:input message="tns:GetWeightSoapIn" />
      <wsdl:output message="tns:GetWeightSoapOut" />
    </wsdl:operation>
  </wsdl:portType>
  <wsdl:binding name="BaseServiceSoap" type="tns:BaseServiceSoap">
    <soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="GetWeight">
      <soap:operation soapAction="http://tempuri.org/GetWeight" 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="BaseServiceSoap1" type="tns:BaseServiceSoap">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
    <wsdl:operation name="GetWeight">
      <soap12:operation soapAction="http://tempuri.org/GetWeight" style="document" />
      <wsdl:input>
        <soap12:body use="literal" />
      </wsdl:input>
      <wsdl:output>
        <soap12:body use="literal" />
      </wsdl:output>
    </wsdl:operation>
  </wsdl:binding>
  <wsdl:service name="TypeA">
    <wsdl:port name="BaseServiceSoap" binding="tns:BaseServiceSoap">
      <soap:address location="http://localhost:54106/TypeA.asmx" />
    </wsdl:port>
    <wsdl:port name="BaseServiceSoap1" binding="tns:BaseServiceSoap1">
      <soap12:address location="http://localhost:54106/TypeA.asmx" />
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

Upvotes: 1

Views: 2327

Answers (2)

Mike
Mike

Reputation: 106

Yes, You can consume WCF Service & ASP.NET WebService using the same code.

STEP 1- You need to change your WCF service to intercept the soap header first. Use WCFExtras for it.

STEP 2- Consume the proxy generated using ASP.NET Web Service.

Upvotes: 0

Petru Gardea
Petru Gardea

Reputation: 21658

The supposed beauty of web services is that it doesn't matter what the client is, or what is the underlying implementation of the service.

Build your proxy any way you want or can (many will say use WCF) using the contract you said is the same then call the services as you need; I assume the SOAP Addresses are different, so make sure you parameterize that (in the command line arguments)...

Upvotes: 1

Related Questions