2011-02-08 61 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