2011-02-08 30 views
0

我已經創建了SOAP Web服務,該服務可通過使用JSON-RPC橋接的ASIHTTPRequest庫從Objective-C環境訪問。 當我測試它從JavaScript的一切,哪裏好。但是從Objective-C的我得到了一個錯誤使用asihttprequest訪問Web服務時未發現方法

{"id":2,"error":{"code":591,"msg":"method not found (session may have timed out)"}} 

Web服務:

@WebService() 
public class UserWS { 

/** 
* User data list - id, first name, last name, service number, username 
*/ 
/** 
* Provides web service to get current user with waiter role data. 
*/ 
@WebMethod(operationName = "getUsers") 
public String[][] getUsers() { 
    String[][] userDara = null; 
    try { 
     Context context = POSNamingService.getContext(); 
     Users us = (Users) context.lookup("business.Users"); 
     List<User> users = us.getWaiterUsers(); 
     userDara = new String[users.size()][5]; 
     for (int i = 0; i < userDara.length; i++) { 
      User user = users.get(i); 
      userDara[i][0] = String.valueOf(user.getUserNo()); 
      userDara[i][1] = user.getFirstName(); 
      userDara[i][2] = user.getLastName(); 
      userDara[i][3] = user.getServiceNo(); 
      userDara[i][4] = user.getLogin(); 
     } 
    } catch (NamingException ex) { 
     Logger.getLogger(UserWS.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    return userDara; 
} 

大橋類:

public class Bridge { 

private UserWS userWS = new UserWS(); 

public String[][] getUsers(int i) { 
    return userWS.getUsers(); 
} 

Objecitive-C端:

(IBAction)clickDownloadButton:(id)sender { 
NSURL *url = [NSURL URLWithString:@"http://10.200.0.24:1445/TestRPC-war/JSONRPC"]; 
ASIHTTPRequest *request = [[[ASIHTTPRequest alloc] initWithURL:url] autorelease]; 
NSString *sendData = [NSString stringWithFormat:@"{\"method\": \"getUsers\"}"]; 
request appendPostData:[sendData dataUsingEncoding:NSUTF8StringEncoding]]; 
[request setRequestMethod:@"GET"]; 
[request setDelegate:self]; 
[request setDidFailSelector:@selector(requestWentWrong:)]; 
[request setTimeOutSeconds:60]; 
[request startAsynchronous]; 
} 

回答

1

你ASIHTTPRequest實例request是一個utoreleased。這意味着只要您的-clickDownloadButton:方法結束,它就會立即釋放,這可能會提前終止您的會話。

相反,你應該讓request成爲一個實例變量,在你的方法中分配它(但不要自動釋放它),然後在請求完成時釋放它。

+0

或者甚至更好,如果需要,您可以創建一個ASINetworkQueue類型的實例變量。 – SlowTree 2011-09-12 14:31:31