2011-03-14 289 views
2

我正在从iPhone发送POST请求到web服务,这是一个基于SOAP的REST层。我得到错误408请求超时,在iPhone设备和模拟器上进行测试。在使用模拟器进行测试时,我注意到如果我先从浏览器访问网络服务器,然后运行模拟器,问题消失并且通信正常。行为与此问题非常相似HTTP, 408 Request timeout 以下是我用来创建POST请求的代码。有没有人遇到过这种行为,并找到了解决方案?HTTP错误408访问网络服务

NSString * urlString = [NSString stringWithFormat:@"%@%@", kBaseURL,method]; 
NSURL * myURL = [NSURL URLWithString:urlString]; 
NSLog(@"URL %@", myURL); 

NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:myURL]; 
[theRequest setHTTPMethod:@"POST"]; 
[theRequest setValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"]; 
[theRequest setHTTPBody:[body dataUsingEncoding:NSUTF8StringEncoding]]; 
[theRequest setTimeoutInterval:60]; // leave at default 60 secs 
NSLog(@"Post Body: %@",body); 
NSURLConnection *theConnection = [[NSURLConnection alloc] 
            initWithRequest:theRequest 
            delegate:self]; 
if(theConnection) { 
    if (webData){ 
     [webData release]; 
    } 
    webData = [[NSMutableData data] retain]; 
    NSLog(@"connection set up"); 
} 
else { 
    NSLog(@"theConnection is NULL"); 
} 
self.mainConnection=theConnection; 
[theConnection release]; 
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES; 

回答

2

对不起,我的英语,

我也遇到过这样的问题。我的应用程序是一个调用web服务的exe文件。 web服务使用apache cxf编码。然后,我在客户端发生了一个错误“远程服务器返回了意外的响应(408)请求超时”。但如果我首先从浏览器访问wsdl,我的exe运行成功。我还没有找到任何解决方案。我在调用webservice之前添加了下面的代码。

WebClient x = new WebClient(); 

string source = x.DownloadString("http://......../InfoOperations?wsdl"); 

    if (source != "") 
    { 
     // Call your web method here... 
    } 

它与浏览器做同样的事情。这解决了这个问题。但通常情况下,我们不需要添加此代码。

然后,我改变了webservise编码。我使用了Axis2。但我的问题没有解决。 我认为这个问题与防火墙有关。

Connection to webservice times out first time

http://www.mustafakurkcu.com/java/230-cxfclientreturn408.html

1

我终于发现是什么造成了这一点。我尝试更改网址,发现我可以访问任何其他网站,但不能访问我需要与之通信的网络服务器。我在3个不同的网络上测试了3G上的iPhone,所以它在我的本地网络上不成问题。我也尝试使用ASIHTTPRequest而不是NSURLConnection,这没有效果。如果我在同一台设备上打开web浏览器并在尝试访问Web服务之前将其指向远程服务器,则连接正常工作。
原来远程服务器没有正确处理POST请求,但它正在处理GET OK。浏览器使用GET,所以这就是为什么浏览器能够在我的Web服务(使用POST)无法建立连接时。一个快速和令人讨厌的解决方法是发送一个GET请求,并在尝试POST请求之前等待它完成。