2009-03-21 34 views
74

Tôi đang tạo một máy chủ trong .NET và ứng dụng khách cho Android. Tôi muốn thực hiện một 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ột máy chủ gửi lại một chuỗi phiên.Cách sử dụng Dịch vụ WCF với Android

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 các phương pháp sau đây:

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 đã không tìm ra bất cứ điều gì.

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

Cảm ơn!

+2

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

Trả lời

39

Để bắt đầu với WCF, nó có thể được dễ dàng nhất để chỉ cần sử dụng định dạng SOAP mặc định và HTTP POST (chứ không phải GET) cho các trang web - ràng buộc dịch vụ. Các ràng buộc HTTP dễ nhất để làm việc là "basicHttpBinding". Dưới đây là một ví dụ về những gì ServiceContract/OperationContract có thể trông giống như đố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 thực hiện các 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ày như một dịch vụ cửa sổ bằng cách sử dụng một ServiceHost, hoặc bạn có thể lưu trữ nó trong IIS giống như một ứng dụng ASP.NET (dịch vụ) thông thường. Có rất nhiều hướng dẫn ở đó cho cả hai.

Các WCF dịch vụ cấu hình có thể trông như thế này:

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

(Các công cụ MEX là tùy chọn cho sản xuất, nhưng là cần thiết để thử nghiệm với WcfTestClient.exe, và cho lộ meta-data dịch vụ).

Bạn sẽ phải sửa đổi mã Java của mình để BẬT một thông báo SOAP cho dịch vụ. WCF có thể là một chút cầu kỳ khi liên hệ với các khách hàng không phải WCF, vì vậy bạn sẽ phải gây rối với các tiêu đề POST một chút để làm cho nó hoạt động. Khi bạn chạy, bạn có thể bắt đầu điều tra bảo mật cho đăng nhập (có thể cần phải 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.

Dưới đây là ví dụ về HTTP POST sẽ trông như thế nào từ mã Java. Có một công 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ề làm thế nào để có được duplex wcf-comunication? Bỏ phiếu hoặc đẩy thật 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ợ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 khuyên bạn nên REST ngay bây giờ, câu trả lời này là từ vài năm trước khi REST/JSON không phổ biến như bây giờ. –

6

Bạn sẽ cần thêm điều gì đó mà một yêu cầu http để tương tác với dịch vụ WCF UNLESS 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 để làm các dịch vụ WCF REST:

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

7

Một tùy chọn khác có thể là tránh WCF toàn bộ 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ỉ viết lại một phản hồi cho mã Java.

+6

Bạn có thể làm điều này, nhưng không có một khung thích hợp, nó cảm thấy như thế này sẽ dễ vỡ và khó bảo trì. Làm thế nào bạn sẽ tài liệu giao diện REST cho khách hàng? Nếu bạn muốn JSON thì sao? v.v. – Cheeso

3

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

4

Từ kinh nghiệm gần đây của tôi, tôi khuyên bạn nên sử dụng thư viện ksoap để sử dụng Dịch vụ WCF xà phòng, thực sự rất dễ dàng, điều này cũng giúp ích cho bạn.

+0

ksoap sử dụng XML và REST được khuyến nghị cho các thao tác như thế này. –

Các vấn đề liên quan