Search This Blog

Monday, November 15, 2010

How to consume WCF service from Java - step by step

Here is a step by step sample how to consume WCF service from java.

WCF in VS.NET (2008 in my case):
create a new project
file->new->project->web->wcf service application
leave the default settings as is , a new WCF service created by the wizard called Service1.svc.
press F5 -> make sure you can see the service page http://localhost:2813/Service1.svc and his wsdl file
http://localhost:2813/Service1.svc?wsdl.

to connect from java to WCF service we have to change the binding type from the default "wsHttpBinding" to "basicHttpBinding".
to do that , edit the Web.config file
change the end point to somthing like this :
<endpoint address="" binding="basicHttpBinding" bindingconfiguration="Binding1" contract="WcfService1.IService1"> </endpoint>

add the next binding section ( you can change it as you like)
<bindings>
<basicHttpBinding>
<binding name="Binding1"
hostNameComparisonMode="StrongWildcard"
receiveTimeout="00:10:00"
sendTimeout="00:10:00"
openTimeout="00:10:00"
closeTimeout="00:10:00"
maxReceivedMessageSize="65536"
maxBufferSize="65536"
maxBufferPoolSize="524288"
transferMode="Buffered"
messageEncoding="Text"
textEncoding="utf-8"
bypassProxyOnLocal="false"
useDefaultWebProxy="true" >
<security mode="None" />
</binding>
</basicHttpBinding>
</bindings>
press F5 -> make sure you can see the service page after the changes  http://localhost:2813/Service1.svc and his wsdl file http://localhost:2813/Service1.svc?wsdl

JAVA side:
open cmd  window
cd to your axis2/bin directory  , cd C:\Program Files\Apache Software Foundation\axis2-1.5.2\bin
create directory test in the bin folder , mkdir test.
run the next batch file from your bin directory
wsdl2java.bat -o test -uri http://localhost:2813/Service1.svc?wsdl
the above command should generate the java stub to connect to your wcf service.
Service1CallbackHandler.java and Service1Stub.java.

add those file into your java test program and create your test function.
public static void CallWCFService()
{
try {
Service1Stub srv1 = new Service1Stub();
srv1._getServiceClient().getOptions().setProperty(org.apache.axis2.transport.http.HTTPConstants.CHUNKED,Boolean.FALSE);
Service1Stub.GetData data = new Service1Stub.GetData();
data.setValue(44);
Service1Stub.GetDataResponse reposne = srv1.getData(data);
System.out.println(reposne.getGetDataResult());
} catch (AxisFault e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RemoteException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

if you will remark the yellow line (enable the chunk), you will get the
org.apache.axis2.AxisFault: The input stream for an incoming message is null.
when i disabled the chunk , it works perfect.

i would like to say a special thanks to Yaron Naveh , that guide & helped me to get this works,Yaron have a very informative blog on this subject too, thanks Yaron !!!

From Microsoft article (http://msdn.microsoft.com/library/ee958158.aspx)

“For communication with the Java EE-based reservation application, a binding that uses standard SOAP on the wire is required. If the application and the platform it runs on support some or all of the WS-* specifications, the endpoint used by this client might choose WsHttpBinding. This would allow reliable, secure, and transactional communication between the two applications.
If this application and the platform it runs on support only standard SOAP matching the WS-I Basic Profile, however, the endpoint it uses to access the rental car reservation application would use BasicHttpBinding. If transport security is required, this binding could be configured to use HTTPS instead of plain HTTP.”

enjoy
Yaniv Tzanany

7 comments:

Anonymous said...

Thank you. I was about to throw the PC out the window.

Sarosh said...

Thank you for this tutorial. However im still a beginner and I would like to know what further steps need to be taken to get the Java client up and running.
I am using NetBeans IDE and im having a few problems with it.

Deepa said...

Thank you so much for sharing this information. I was battling with the issue from past 2 days and your post made it really easy to understand and implement.

Deepa said...

Hi Yaniv,

Do you know, instead of Axis2, how can I use older Axis (1.1) and what will code look like for Java Client? I tried to use Eclipse/Axis 1.1 but for some reason it's not generating any proper classes for me when I specify the WSDL URL.

Thanks,
Deepa.

mprmax said...

Hi I'm very new to all this WCF stuff so forgive my ignorance. Is it possible (or even desirable) to get a Java webservice (i.e. running on Oracle WebLogic) to talk to a .NET WCF web service and have the message encoding set so that the data is transmitted as binary data. i.e. Can a weblogic webservice consume .NET WCF webservice and communicate the data in binary message format. I keep onseeing MTOM being mentioned as binary format and from my basic readin it seem that a weblogic webservice and wcf webservice can both understand that format. I've probably got really confused but I've been asked to look at an area that I'm not very familiar with. Many thanks to anyone who can help clear up my confusion.

Anonymous said...

I got this AxisFault and your solution fixed it - thanks a lot, you saved me a lot of time!

Unknown said...

I simply want to tell you that I am new to weblog and definitely liked this blog site. Very likely I’m going to bookmark your blog . You absolutely have wonderful stories. Cheers for sharing with us your blog. http://www.autotransportquotes.co