Android에서 WCF 서비스를 사용하는 방법


79

.NET에서 서버와 Android 용 클라이언트 응용 프로그램을 만들고 있습니다. 사용자 이름과 암호를 서버에 보내고 서버가 세션 문자열을 다시 보내는 인증 방법을 구현하고 싶습니다.

WCF에 익숙하지 않으므로 도움을 주셔서 감사합니다.

Java에서는 다음과 같은 방법을 작성했습니다.

private void Login()
{
  HttpClient httpClient = new DefaultHttpClient();
  try
  {
      String url = "http://192.168.1.5:8000/Login?username=test&password=test";

    HttpGet method = new HttpGet( new URI(url) );
    HttpResponse response = httpClient.execute(method);
    if ( response != null )
    {
      Log.i( "login", "received " + getResponse(response.getEntity()) );
    }
    else
    {
      Log.i( "login", "got a null response" );
    }
  } catch (IOException e) {
    Log.e( "error", e.getMessage() );
  } catch (URISyntaxException e) {
    Log.e( "error", e.getMessage() );
  }
}

private String getResponse( HttpEntity entity )
{
  String response = "";

  try
  {
    int length = ( int ) entity.getContentLength();
    StringBuffer sb = new StringBuffer( length );
    InputStreamReader isr = new InputStreamReader( entity.getContent(), "UTF-8" );
    char buff[] = new char[length];
    int cnt;
    while ( ( cnt = isr.read( buff, 0, length - 1 ) ) > 0 )
    {
      sb.append( buff, 0, cnt );
    }

      response = sb.toString();
      isr.close();
  } catch ( IOException ioe ) {
    ioe.printStackTrace();
  }

  return response;
}

하지만 지금까지 서버 측에서는 아무것도 알아 내지 못했습니다.

적절한 App.config 설정을 사용하여 적절한 메서드 문자열 Login (string username, string password)을 만들고 적절한 [OperationContract] 서명을 사용하여 인터페이스를 만드는 방법을 설명 할 수 있다면 정말 감사 할 것입니다. 세션 문자열.

감사!


2
Android에서 직렬화 된 wcf 바이너리를 사용하는 방법을보고 싶습니다. 이제 멋질 것입니다.
Brady Moritz

답변:


41

WCF를 시작하려면 웹 서비스 바인딩에 기본 SOAP 형식과 HTTP POST (GET 대신)를 사용하는 것이 가장 쉽습니다. 가장 쉬운 HTTP 바인딩은 "basicHttpBinding"입니다. 다음은 로그인 서비스에 대한 ServiceContract / OperationContract의 예입니다.

[ServiceContract(Namespace="http://mycompany.com/LoginService")]
public interface ILoginService
{
    [OperationContract]
    string Login(string username, string password);
}

서비스 구현은 다음과 같습니다.

public class LoginService : ILoginService
{
    public string Login(string username, string password)
    {
        // Do something with username, password to get/create sessionId
        // string sessionId = "12345678";
        string sessionId = OperationContext.Current.SessionId;

        return sessionId;
    }
}

ServiceHost를 사용하여 Windows 서비스로 호스팅하거나 일반 ASP.NET 웹 (서비스) 응용 프로그램처럼 IIS에서 호스팅 할 수 있습니다. 이 두 가지 모두에 대한 많은 자습서가 있습니다.

WCF 서비스 구성은 다음과 같습니다.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>


    <system.serviceModel>
        <behaviors>
            <serviceBehaviors>
                <behavior name="LoginServiceBehavior">
                    <serviceMetadata />
                </behavior>
            </serviceBehaviors>
        </behaviors>

        <services>
            <service name="WcfTest.LoginService"
                     behaviorConfiguration="LoginServiceBehavior" >
                <host>
                    <baseAddresses>
                        <add baseAddress="http://somesite.com:55555/LoginService/" />
                    </baseAddresses>
                </host>
                <endpoint name="LoginService"
                          address=""
                          binding="basicHttpBinding"
                          contract="WcfTest.ILoginService" />

                <endpoint name="LoginServiceMex"
                          address="mex"
                          binding="mexHttpBinding"
                          contract="IMetadataExchange" />
            </service>
        </services>
    </system.serviceModel>
</configuration>

(MEX 항목은 프로덕션에서는 선택 사항이지만 WcfTestClient.exe로 테스트하고 서비스 메타 데이터를 노출하는 데 필요합니다.)

SOAP 메시지를 서비스에 게시하려면 Java 코드를 수정해야합니다. WCF는 비 WCF 클라이언트와 상호 운용 할 때 약간 까다로울 수 있으므로 작동하려면 POST 헤더를 약간 엉망으로 만들어야합니다. 이 작업이 실행되면 로그인 보안 조사를 시작하거나 (보안을 강화하기 위해 다른 바인딩을 사용해야 할 수 있음) WCF REST를 사용하여 SOAP / POST가 아닌 GET을 사용한 로그인을 허용 할 수 있습니다.

다음은 Java 코드에서 HTTP POST가 어떻게 보이는지에 대한 예입니다. 웹 서비스를 디버깅하는 데 정말 유용한 " Fiddler " 라는 도구 가 있습니다.

POST /LoginService HTTP/1.1
Content-Type: text/xml; charset=utf-8
SOAPAction: "http://mycompany.com/LoginService/ILoginService/Login"
Host: somesite.com:55555
Content-Length: 216
Expect: 100-continue
Connection: Keep-Alive

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<Login xmlns="http://mycompany.com/LoginService">
<username>Blah</username>
<password>Blah2</password>
</Login>
</s:Body>
</s:Envelope>

1
이중 wcf-comunication을 얻는 방법에 대한 아이디어가 있습니까? 폴링이나 진정한 푸시는 중요하지 않습니다.
Alxandr

1
REST 옵션을 권장합니다. SOAP는 장점보다 더 많은 문제를 가져올 것입니다. SSL 암호화와 함께 REST를 사용하면 웹 서비스가 매우 안전합니다.
Rafa 2012

4
예, 지금도 REST를 권장합니다.이 답변은 몇 년 전 REST / JSON이 지금처럼 널리 퍼지지 않았던 것입니다.
Andy White


7

또 다른 옵션은 WCF를 모두 피하고 .NET HttpHandler를 사용하는 것입니다. HttpHandler는 GET에서 쿼리 문자열 변수를 가져 와서 Java 코드에 대한 응답을 다시 쓸 수 있습니다.


6
이 작업을 수행 할 수는 있지만 적절한 프레임 워크가 없으면 취약하고 유지 관리하기 어려울 것 같습니다. 클라이언트에 REST 인터페이스를 어떻게 문서화 하시겠습니까? JSON이 필요하다면? 등
Cheeso

6

WCF 서비스에 REST 인터페이스가없는 경우 WCF 서비스와 상호 작용하려면 http 요청보다 더 많은 것이 필요합니다. Android에서 실행되는 SOAP 웹 서비스 API를 찾거나 서비스를 RESTful로 만드십시오. WCF REST 서비스를 수행하려면 .NET 3.5 SP1이 필요합니다.

http://msdn.microsoft.com/en-us/netframework/dd547388.aspx


4

내 최근의 경험에서 내가 추천 할 것입니다 ksoap 비누 WCF 서비스는 실제로 정말 쉽게,이 anddev의 소비 라이브러리 스레드 너무 migh 도움이 당신을합니다.


ksoap은 XML을 사용하며 이와 같은 작업에는 REST가 권장됩니다.
Sreekanth Karumanaghat

3

이 작업을 수행하는 경우 서버에서 WCF REST를 사용 하고 Java / Android 클라이언트에서 REST 라이브러리 를 사용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.