Cách sử dụng dịch vụ WCF với Android


79

Tôi đang tạo một máy chủ trong .NET và một ứng dụng khách cho Android. Tôi muốn triển khai phương thức xác thực gửi tên người dùng và mật khẩu tới máy chủ và máy chủ sẽ gửi lại một chuỗi phiên.

Tôi không quen với WCF vì vậy tôi thực sự đánh giá cao sự giúp đỡ của bạn.

Trong java, tôi đã viết phương thức sau:

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

Nhưng ở phía máy chủ cho đến nay tôi vẫn chưa tìm ra bất cứ điều gì.

Tôi sẽ thực sự biết ơn nếu ai đó có thể giải thích cách tạo chuỗi phương thức thích hợp Đăng nhập (tên người dùng chuỗi, mật khẩu chuỗi) với cài đặt App.config thích hợp và Giao diện có chữ ký [OperationContract] thích hợp để đọc hai thông số này từ máy khách và trả lời bằng chuỗi phiên.

Cảm ơn!


2
Tôi muốn xem một cách để sử dụng wcf nhị phân được tuần tự hóa trên Android. Bây giờ nó sẽ được mát mẻ.
Brady Moritz

Câu trả lời:


41

Để bắt đầu với WCF, có thể đơn giản nhất là chỉ cần sử dụng định dạng SOAP mặc định và HTTP POST (thay vì GET) cho các ràng buộc dịch vụ web. Liên kết HTTP dễ dàng nhất để hoạt động là "basicHttpBinding". Dưới đây là một ví dụ về ServiceContract / OperationContract có thể trông như thế nào đối với dịch vụ đăng nhập của bạn:

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

Việc triển khai dịch vụ có thể trông như thế này:

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

Bạn có thể lưu trữ nó dưới dạng một dịch vụ windows bằng ServiceHost hoặc bạn có thể lưu trữ nó trong IIS như một ứng dụng web (dịch vụ) ASP.NET bình thường. Có rất nhiều hướng dẫn trên mạng cho cả hai điều này.

Cấu hình dịch vụ WCF có thể trông giống như sau:

<?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>

(Nội dung MEX là tùy chọn để sản xuất, nhưng cần thiết để thử nghiệm với WcfTestClient.exe và để hiển thị siêu dữ liệu dịch vụ).

Bạn sẽ phải sửa đổi mã Java của mình để ĐĂNG một thông báo SOAP lên dịch vụ. WCF có thể hơi kén khi vận hành với các máy khách không phải WCF, vì vậy bạn sẽ phải làm rối với các tiêu đề POST một chút để nó hoạt động. Khi bạn bắt đầu chạy, bạn có thể bắt đầu điều tra bảo mật cho đăng nhập (có thể cần sử dụng một ràng buộc khác để bảo mật tốt hơn) hoặc có thể sử dụng WCF REST để cho phép đăng nhập bằng GET thay vì SOAP / POST.

Đây là một ví dụ về HTTP POST sẽ trông như thế nào từ mã Java. Có một công cụ được gọi là " Fiddler " có thể thực sự hữu ích để gỡ lỗi các dịch vụ web.

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
Bất kỳ ý tưởng về cách tải wcf-comunication song công? Thăm dò ý kiến ​​hay sự thúc đẩy thực sự không quan trọng.
Alxandr

1
Tôi muốn giới thiệu tùy chọn REST, SOAP sẽ mang lại cho bạn nhiều vấn đề hơn là lợi thế. Nếu bạn sử dụng REST với mã hóa SSL, dịch vụ web của bạn sẽ rất an toàn.
Rafa

4
Vâng, tôi cũng muốn giới thiệu REST ngay bây giờ, câu trả lời này là từ vài năm trước khi REST / JSON chưa thịnh hành như bây giờ.
Andy White


7

Một tùy chọn khác có thể là tránh WCF kết hợp với nhau và chỉ sử dụng .NET HttpHandler. HttpHandler có thể lấy các biến chuỗi truy vấn từ GET của bạn và chỉ cần viết lại phản hồi cho mã Java.


6
Bạn có thể làm điều này, nhưng nếu không có một khuôn khổ thích hợp, có vẻ như điều này sẽ rất mỏng manh và khó duy trì. Bạn sẽ ghi lại giao diện REST cho khách hàng như thế nào? Nếu bạn muốn JSON thì sao? vv vv
Cheeso

6

Bạn sẽ cần một cái gì đó nữa là một yêu cầu http để tương tác với một dịch vụ WCF BẤT NGỜ dịch vụ WCF của bạn có giao diện REST. Tìm kiếm một API dịch vụ web SOAP chạy trên Android hoặc làm cho dịch vụ của bạn RESTful. Bạn sẽ cần .NET 3.5 SP1 để thực hiện các dịch vụ WCF REST:

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


4

Từ kinh nghiệm gần đây của tôi tôi muốn giới thiệu kSOAP thư viện để tiêu thụ một WCF Service xà phòng, thực sự thực sự dễ dàng của nó, điều này anddev chủ đề migh giúp bạn ra ngoài quá.


ksoap sử dụng XML và REST được khuyến nghị cho các hoạt động như thế này.
Sreekanth Karumanaghat

3

Nếu tôi đang làm điều này, tôi có thể sẽ sử dụng WCF REST trên máy chủ và thư viện REST trên máy khách Java / Android.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.