2013-03-10 7 views
2

나는이 윈도우 기반 REST 서버를 사용하여 구축 된 마이크로 소프트 HTTPAPI (즉이 아니 IIS에서 실행)타임 아웃

나는 브라우저 기반의 REST 도구에서 서비스에 JSON 요청을 보내는 경우 (Firefox RESTClient) 서버는 요청을 받아서 Microsoft Service Trace Viewer의 추적 및 서비스의 응답에 따라 올바르게 처리합니다. 서비스에서 유효한 JSON을 수신합니다.

NSURLConnect를 사용하여 JSON 요청을 서비스에 전송하는 iOS 애플리케이션이 있지만 항상 시간이 초과됩니다. WireShark를 사용하여 추적했는데 두 경우 모두 HTTP 요청이 올바르게 구성되어 서버로 올바르게 전송되었습니다. 나는 MS 추적 뷰어를 사용하여 추적했고 "수신 바이트"로 들어가지만 결코 반환하지 않습니다. 결국 WCF Server를 닫을 때 예외가 발생합니다. iOS 앱을 닫을 때 절대 반환되지 않습니다.

NSURLConnection sendSynchronousRequest를 사용하고 비동기 적으로 콜백을 사용하고 비동기 적으로 완료 블록을 사용하여 시도했습니다. 타임 아웃을 0으로 만들면 sendSynchronousRequest에 대한 호출이 결코 반환되지 않습니다. 다른 모든 경우에, 나는 시간 제한을받을하고, WCF는 결코 WCF 호출의 수신 바이트 부분 (POST 요청) 내가 여기

을 확인했습니다

을 완료하지의 내 아이폰 OS 코드 :

dispatch_queue_t myQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_async(myQ, ^{ // First Queue the parsing 
    @try { 
     //Generate endpoint url 
     NSURL *url = [NSURL URLWithString:[NSString stringWithFormat:@"%@/%@",appState.posPostingURL,serviceName]]; 
     //Setup request 
     NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url 
                   cachePolicy:NSURLRequestReloadIgnoringCacheData 
                  timeoutInterval:10.0]; 

     NSString *authStr = [NSString stringWithFormat:@"%@:%@", @"xxxx", @"xxxx"]; 
     NSString *authData = [NSString base64StringFromString:authStr]; 
     NSString *authValue = [NSString stringWithFormat:@"Basic %@", authData]; 
     [request setValue:authValue forHTTPHeaderField:@"Authorization"]; 

     //Setup request headers 
     [request setHTTPMethod:@"POST"]; 
     [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 
     [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
     [request setValue:@"no-cache" forHTTPHeaderField:@"Cache-Control"]; 
     [request setValue:[NSString stringWithFormat:@"%d", [dataBuffer length]] forHTTPHeaderField:@"Content-Length"]; 

     // Put the request data in the request body 
     [request setHTTPBody: dataBuffer]; 
     NSHTTPURLResponse *urlResponse = nil; 
     NSError *error = nil; 
     // and send to the server synchronously 
     serverData = [[NSURLConnection sendSynchronousRequest:request 
              returningResponse:&urlResponse 
                 error:&error] mutableCopy]; 
     // Now check the status and response 
     if (error) { 
app.config 파일에서

namespace MyWebService{ 
[ServiceContract(Name = "MyServiceIntegrator", Namespace = "")] 
public interface IMyIntegrator 
{ 
    [OperationContract] 
    [WebInvoke(Method = "POST", UriTemplate = "/Configure", 
     BodyStyle=WebMessageBodyStyle.Bare, 
     RequestFormat = WebMessageFormat.Json, 
     ResponseFormat = WebMessageFormat.Json)] 
    Result Configure(MyServerConfig config); 

을 다음과 같이

내 WCF 코드는, 서비스 엔드 포인트는

로 구성되어 있습니다 다음과 같이
binding="webHttpBinding" 

추적보기는 다음과 같습니다 WCF Trace

는 서버가 JSON이 유효하더라도 읽을 완료되지 양쪽에 어떤 이유가있을 수 있습니다.

나는 또한 NSURLConnection JSON Submit to Server 을 확인했으며, 요청을 보내기 위해 내 코드가 올바른지 확인할 수 있습니다. 이에

[request setValue:[NSString stringWithFormat:@"%d", [dataBuffer length]] forHTTPHeaderField:@"Content-Length"]; 

:

[request setValue:[NSString stringWithFormat:@"%i", [dataBuffer length]] forHTTPHeaderField:@"Content-Length"]; 

아마를하지 않습니다 -

모든 아이디어는이 설정을 변경하면 어떻게됩니까 이제 삼일

+0

Charles 또는 Fiddler와 같은 프록시를 통해 데이터를 보내고 작동중인 요청과 작동하지 않는 요청의 차이점을 확인하는 것이 좋습니다. – Thorsten

+0

인증을 필요로하지 않는 엔드 포인트에 대한 요청 테스트를 시도 했습니까? 그게 문제를 일으키는 지 궁금합니다. – KevinH

+0

철저한 게시물을 보내는 문자열 중 하나에 '&'..가 포함되어있을 때 문제가 발생했습니다. 그 다음에는 휴식이 ... [다음] (http://stackoverflow.com/questions/3423545/objective- c-iphone-percent-encode-a-string/3426140 # 3426140) – chuthan20

답변

0

내 머리를 잡아 당겨되었다 차이점은 있지만 나머지 코드는 잘 어울릴 것 같습니다. (내 생각은 십진수가 서버 문제를 일으키는 것입니다.)

+0

아무런 차이 없음 - 또한 % u 시도 - 생각을 감사합니다. – ferdil

0

ferdil, 내가 대신 10

NSMutableURLRequest * 요청 = 30.0에 제한 시간을 변경하려고 할 수 있다고 생각 [NSMutableURLRequest requestWithURL : 홈페이지를 cachePolicy : NSURLRequestReloadIgnoringCacheData timeoutInterval : 30.0]

+0

감사하지만 차이는 없습니다. – ferdil