Connection refused when calling SOAP Webservice using Android
I developed a webservice in .net and I'm trying to call it in Android. To call the webservice I'm using ksoap2.
The WDSL's URL is: http://localhost/Cidadaos_Cidade/Open.asmx?WSDL
Here's the WSDL
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://Cidadaos_Cidade/Open/" xmlns:s0="http://www.outsystems.com" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" targetNamespace="http://Cidadaos_Cidade/Open/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/">
<wsdl:types>
<s:schema elementFormDefault="qualified" targetNamespace="http://www.outsystems.com">
<s:element name="GetCategoriasFull">
<s:complexType />
</s:element>
<s:element name="GetCategoriasFullResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Out1" type="s0:ArrayOfWORCCategoriaSubcategoriaRecord" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ArrayOfWORCCategoriaSubcategoriaRecord">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="WORCCategoriaSubcategoriaRecord" nillable="true" type="s0:WORCCategoriaSubcat开发者_高级运维egoriaRecord" />
</s:sequence>
</s:complexType>
<s:complexType name="WORCCategoriaSubcategoriaRecord">
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="ssENCategoria" type="s0:Categoria" />
<s:element minOccurs="0" maxOccurs="1" name="ssENSubcategoria" type="s0:Subcategoria" />
</s:sequence>
</s:complexType>
<s:complexType name="Categoria">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Id" type="s:int" />
<s:element minOccurs="0" maxOccurs="1" name="Nome" type="s:string" />
</s:sequence>
</s:complexType>
<s:complexType name="Subcategoria">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="Id" type="s:int" />
<s:element minOccurs="0" maxOccurs="1" name="Nome" type="s:string" />
<s:element minOccurs="0" maxOccurs="1" name="Imagem" type="s:string" />
<s:element minOccurs="1" maxOccurs="1" name="CategoriaId" type="s:int" />
</s:sequence>
</s:complexType>
<s:element name="GetCategorias">
<s:complexType />
</s:element>
<s:element name="GetCategoriasResponse">
<s:complexType>
<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="Out1" type="s0:ArrayOfCategoria" />
</s:sequence>
</s:complexType>
</s:element>
<s:complexType name="ArrayOfCategoria">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="Categoria" nillable="true" type="s0:Categoria" />
</s:sequence>
</s:complexType>
</s:schema>
</wsdl:types>
<wsdl:message name="GetCategoriasFullSoapIn">
<wsdl:part name="parameters" element="s0:GetCategoriasFull" />
</wsdl:message>
<wsdl:message name="GetCategoriasFullSoapOut">
<wsdl:part name="parameters" element="s0:GetCategoriasFullResponse" />
</wsdl:message>
<wsdl:message name="GetCategoriasSoapIn">
<wsdl:part name="parameters" element="s0:GetCategorias" />
</wsdl:message>
<wsdl:message name="GetCategoriasSoapOut">
<wsdl:part name="parameters" element="s0:GetCategoriasResponse" />
</wsdl:message>
<wsdl:portType name="OpenSoap">
<wsdl:operation name="GetCategoriasFull">
<wsdl:input message="tns:GetCategoriasFullSoapIn" />
<wsdl:output message="tns:GetCategoriasFullSoapOut" />
</wsdl:operation>
<wsdl:operation name="GetCategorias">
<wsdl:input message="tns:GetCategoriasSoapIn" />
<wsdl:output message="tns:GetCategoriasSoapOut" />
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="OpenSoap" type="tns:OpenSoap">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="GetCategoriasFull">
<soap:operation soapAction="http://Cidadaos_Cidade/Open/GetCategoriasFull" style="document" />
<wsdl:input>
<soap:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetCategorias">
<soap:operation soapAction="http://Cidadaos_Cidade/Open/GetCategorias" 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="OpenSoap12" type="tns:OpenSoap">
<soap12:binding transport="http://schemas.xmlsoap.org/soap/http" />
<wsdl:operation name="GetCategoriasFull">
<soap12:operation soapAction="http://Cidadaos_Cidade/Open/GetCategoriasFull" style="document" />
<wsdl:input>
<soap12:body use="literal" />
</wsdl:input>
<wsdl:output>
<soap12:body use="literal" />
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetCategorias">
<soap12:operation soapAction="http://Cidadaos_Cidade/Open/GetCategorias" 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="Open">
<wsdl:port name="OpenSoap" binding="tns:OpenSoap">
<soap:address location="http://localhost/Cidadaos_Cidade/Open.asmx" />
</wsdl:port>
<wsdl:port name="OpenSoap12" binding="tns:OpenSoap12">
<soap12:address location="http://localhost/Cidadaos_Cidade/Open.asmx" />
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
And here's the code to call it
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
SoapSerializationEnvelope soapEnvelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
//soapEnvelope.dotNet = true; //tried with and without this flag
soapEnvelope.setOutputSoapObject(request);
AndroidHttpTransport aht = new AndroidHttpTransport(URL);
try{
//crashes in the following line with the exception:
//java.net.ConnectException: localhost/127.0.0.1:80 - Connection refused
aht.call(SOAP_ACTION, soapEnvelope);
SoapObject resultsRequestSOAP = (SoapObject) soapEnvelope.bodyIn;
}catch(Exception ex){
ex.printStackTrace();
}
Can anyone help me? I already tried invoking it using a C#.net project and works perfectly. Sorry to put all the XML and code here but I'm desperate...
i dont know much about android development but localhost is a loopback adress to your android device. you need to replace localhost with the name or ip-address of the server that is running your webservice.
In android when you refer to localhost for web service call it will always give you an error because local host is loop back for android. you have to use the alias address for this. Check this lick to add alias address. connection refused error when calling web service - Android
Actually when we run on service on local host the service runs fine but when we try to access the localhost from android it gives error, the reason is "local host" is a loop back address for the android emulator device. so what you have to do is give the alias address. Use the following IP address to call you web service.
Your web service url in android will look like http://10.0.2.2:PortNumber/WebService.php
精彩评论