Як споживати службу WCF з Android


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;
}

Але на стороні сервера я досі нічого не зрозумів.

Буду дуже вдячний, якщо хтось зможе пояснити, як створити відповідний рядок методу Login (рядок імені користувача, рядок пароля) із відповідними налаштуваннями App.config та інтерфейсом із відповідним підписом [OperationContract], щоб прочитати ці два параметри від клієнта та відповісти рядок сеансу.

Дякую!


2
Я хотів би бачити спосіб споживання бінарних файлів wcf, серіалізованих на Android. тепер це було б круто.
Брейді Моріц,

Відповіді:


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;
    }
}

Ви можете розмістити це як службу Windows за допомогою ServiceHost, або ви можете розмістити його в IIS, як звичайний веб-додаток ASP.NET (служби). Існує багато підручників для обох.

Конфігурація служби 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 та для виявлення метаданих служби).

Вам доведеться змінити свій код Java, щоб розмістити на сервісі повідомлення SOAP. WCF може бути трохи вибагливим при взаємодії з клієнтами, які не є WCF, тому вам доведеться трохи возитися з заголовками POST, щоб змусити його працювати. Після того, як ви це запустите, ви можете почати досліджувати безпеку для входу (можливо, доведеться використовувати інше прив'язку, щоб отримати кращий захист), або, можливо, використовувати WCF REST, щоб дозволити входити з GET, а не SOAP / POST.

Ось приклад того, як повинен виглядати HTTP POST із коду Java. Існує інструмент " 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? Опитування чи справжній поштовх не мають значення.
Олександр

1
Я б порекомендував варіант REST, SOAP принесе вам більше проблем, ніж переваг. Якщо ви використовуєте REST із шифруванням SSL, ваша веб-служба буде дуже безпечною.
Рафа

4
Так, я б також рекомендував REST зараз, ця відповідь була кілька років тому, коли REST / JSON були не такими поширеними, як зараз.
Andy White


7

Іншим варіантом може бути уникнення WCF разом і просто використання .NET HttpHandler. HttpHandler може захопити змінні рядка запиту з вашого GET і просто написати відповідь на код Java.


6
Ви могли б це зробити, але без відповідної структури здається, що це було б крихким і важким у підтримці. Як би ви задокументували клієнтам інтерфейс REST? Що робити, якщо ви хочете JSON? і т. ін.
Cheeso

6

Вам знадобиться щось більше, ніж запит http для взаємодії зі службою WCF, ДОКЛИ ваша служба WCF не має інтерфейсу REST. Або шукайте API веб-сервісу SOAP, який працює на Android, або зробіть вашу службу RESTful. Вам знадобиться .NET 3.5 SP1 для надання послуг WCF REST:

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


4

З мого недавнього досвіду я б порекомендував бібліотеці ksoap споживати послугу Soap WCF, це насправді дуже просто, ця тема anddev може вам також допомогти.


ksoap використовує XML і REST рекомендується для таких операцій.
Шрікант Карунаганагат

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.