[.net] Android에서 WCF 서비스를 사용하는 방법

.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] 서명을 사용하여 인터페이스를 만드는 방법을 설명 할 수 있다면 정말 감사 할 것입니다. 세션 문자열.

감사!



답변

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>


답변

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


답변

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

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


답변

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


답변

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


답변