2011-03-14 324 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請求之前等待它完成。