2011-12-13 2 views
0

WCF 서비스 용 Android 클라이언트를 개발 중입니다. 아무런 문제없이 서비스와 함께 작동하는 Windows 응용 프로그램이 있습니다. 그러나 kSoap2를 사용하여 Android에서 서비스를 사용하려고하면 500 개의 내부 서버 오류가 발생합니다. 분명히 나는 ​​잘못된 것을하고 있지만 무엇을 알아 내지 못하고있다. 내 실패 호출 같은 방법의 HTTP 덤프 여기ksoap2를 사용하는 Android에서 WCF 서비스 사용 - 내부 서버 오류

POST /SignService HTTP/1.1 
Content-Type: application/soap+xml; charset=utf-8 
Host: ariadnetest.ariadne.vn 
Content-Length: 995 
Connection: Keep-Alive 

<?xml version="1.0"?> 
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:r="http://schemas.xmlsoap.org/ws/2005/02/rm" xmlns:a="http://www.w3.org/2005/08/addressing"> 
<s:Header> 
    <r:Sequence s:mustUnderstand="1"> 
    <r:Identifier>urn:uuid:b6073cc9-d142-4045-90cb-1ae8d839d400</r:Identifier> 
    <r:MessageNumber>1</r:MessageNumber> 
    </r:Sequence> 
    <a:Action s:mustUnderstand="1">http://tempuri.org/ISignService/GetExistedSignData</a:Action> 
    <a:MessageID>urn:uuid:ad89a2da-6205-460b-b50c-9b354d83594d</a:MessageID> 
    <ActivityId xmlns="http://schemas.microsoft.com/2004/09/ServiceModel/Diagnostics" CorrelationId="9c91571d-e363-45da-ab5b-a83d48f3ec82">468b8556-f549-4d1f-969a-591aae05d4af</ActivityId> 
    <a:ReplyTo> 
    <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address> 
    </a:ReplyTo> 
    <a:To s:mustUnderstand="1">http://ariadnetest.ariadne.vn/SignService</a:To> 
</s:Header> 
<s:Body> 
    <GetExistedSignData xmlns="http://tempuri.org/"> 
    <displayId>HWI_00:1E:8C:87:7F:8D</displayId> 
    </GetExistedSignData> 
</s:Body> 
</s:Envelope> 

됩니다 : 여기

// SOAP consts 
private static final String NAMESPACE = "http://tempuri.org/"; 
private static final String SERVICE_NAME = "/SignService"; 
private static final String SOAP_ACTION = "http://tempuri.org/ISignService/"; 
... 
String url; 
String method_name = "GetExistedSignData"; 

url = mServerAddress + SERVICE_NAME; 

/* the connect logic goes here */ 
try { 
    SoapObject request = new SoapObject(NAMESPACE, method_name); 

    request.addProperty("displayId", "HWI_00:1E:8C:87:7F:8D"); 

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER12); 

    envelope.dotNet = true; 
    //envelope.implicitTypes = true; 
    envelope.setAddAdornments(false); 
    envelope.setOutputSoapObject(request); 

    HttpTransportSE androidHttpTransport = new HttpTransportSE(url); 
    androidHttpTransport.call(method_name, envelope); 
    sb.append(envelope.toString() + "\n"); 
    SoapPrimitive result = (SoapPrimitive)envelope.getResponse(); 

    //to get the data 
    String resultData = result.toString(); 
    sb.append(resultData + "\n"); 
} catch (IOException e) { 
    sb.append("IO Problem:\n" + e.getMessage() + "\n"); 
} catch (XmlPullParserException e) { 
    sb.append("Parser Problem:\n" + e.getMessage() + "\n"); 
} 
catch (Exception e) { 
    sb.append("Error:\n" + e.getMessage() + "\n"); 
} 

성공적으로 메소드를 호출 Windows 클라이언트의 HTTP 덤프입니다 : 여기

내 자바 코드 : 대가로

POST /SignService HTTP/1.1 
User-Agent: ksoap2-android/2.6.0+ 
Content-Type: application/soap+xml;charset=utf-8 
Connection: close 
Content-Length: 358 
Host: ariadnetest.ariadne.vn 
Accept-Encoding: gzip 

<?xml version="1.0"?> 
<v:Envelope xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:d="http://www.w3.org/2001/XMLSchema" xmlns:c="http://www.w3.org/2003/05/soap-encoding" xmlns:v="http://www.w3.org/2003/05/soap-envelope"> 
<v:Header/> 
<v:Body> 
    <GetExistedSignData xmlns="http://tempuri.org/"> 
    <displayId>HWI_00:1E:8C:87:7F:8D</displayId> 
    </GetExistedSignData> 
</v:Body> 
</v:Envelope> 

내가 얻을 :

,451,515,
HTTP/1.0 500 Internal Server Error 
Date: Tue, 13 Dec 2011 15:46:07 GMT 
Pragma: no-cache 
Cache-Control: no-cache 
Content-Type: text/html 
Content-Length: 2114 
Connection: close 

오류 설명의 가장 유용한 부분은 말한다 :

Error Code 64: Host not available 
Background: The connection to the Web server was lost. 

나는 WCF에 익숙하지 않아요 및 .NET 그래서 내가 잘못 될 수 있는지에 대한 선택의 여지입니다. 안드로이드에서 소비해야하는 WCF 서비스를 개발하지 않았습니다.

답변

0

당신은 선택의 여지가 있다면, 그것은 안드로이드에 SOAP를 사용하지 않는 것이 좋습니다. SOAP은 REST보다 훨씬 복잡하며 적어도 현재는 Android에서 사용할 수없는 정교한 프레임 워크가 필요합니다.

+0

다른 선택 사항은 무엇입니까? – ozmank

0

나는이 줄 잘못된 생각 :

androidHttpTransport.call(method_name, envelope); 

첫 번째 인수가 있어야한다 : NAMESPACE + METHOD_NAME

+0

아무런 차이가 없습니다. kSoap2 문서에 따르면 첫 번째 인수는 SOAP 1.2에서 사용되지 않는 "soapAction"헤더 필드를 설정하는 데 사용됩니다. – intellion