Reputation: 51
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
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
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