2013-12-09 5 views
0

내 응용 프로그램에서 문서에 서명하는 webservice를 사용하고 있습니다. SOAP 호출 내에서 document64를 base64 형식으로 보내야합니다. 문제는 내가 11mb와 같은 큰 문서를 보내려고 할 때 base64 (NSString에 저장 됨)가 크고 SOAP 메시지가 잘리는 문제입니다.NSString이 잘리고 있습니다

SOAP 호출을 유용하게 보낼 수 있으므로 서버 오류가 발생합니다.

큰 (매우 큰) 문자열을 저장할 수있는 클래스가 있습니까?

편집 :

가 64 기수로 문서를 변환하려면 :

NSString *soapMsg = [NSString stringWithFormat:@"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:tem=\"http://tempuri.org/\" xmlns:seal=\"http://schemas.datacontract.org/2004/07\">" 
        "<soapenv:Header/>" 
        "<soapenv:Body>" 
        "<tem:Sign>" 
        "<tem:type>Signature</tem:type>" 
        "<tem:biometricState>%@</tem:biometricState>" 
        "<tem:idCertificate>%d</tem:idCertificate>" 
        "<tem:signatureProfile>%@</tem:signatureProfile>" 
        "<tem:signatureType>Default</tem:signatureType>" 
        "<tem:hashAlgorithm>Default</tem:hashAlgorithm>" 
        "<tem:options>%@</tem:options>" 
        "<tem:signingDocument>%@</tem:signingDocument>" 
        "</tem:Sign>" 
        "</soapenv:Body>" 
        "</soapenv:Envelope>", 
        aSign, 
        [aCertificado idCert], 
        tipoFirma, 
        flagFirma, 
        aDocument 
        ]; 

NSString *stringURL = [NSString stringWithFormat:@"http://%@//Service/SignatureServiceBasic.svc", [settings servidor]]; 
    NSURL *sRequestURL = [NSURL URLWithString:stringURL]; 
    NSMutableURLRequest *myRequest = [NSMutableURLRequest requestWithURL:sRequestURL]; 
    NSString *sMessageLength = [NSString stringWithFormat:@"%d", [soapMsg length]]; 

    [myRequest addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; 
    [myRequest addValue:@"http://tempuri.org/ISignatureServiceBasic/Sign" forHTTPHeaderField:@"SOAPAction"]; 
    [myRequest addValue: sMessageLength forHTTPHeaderField:@"Content-Length"]; 
    [myRequest setHTTPMethod:@"POST"]; 
    [myRequest addValue:@"Jakarta Commons-HttpClient/3.1" forHTTPHeaderField:@"User-Agent"]; 
    [myRequest setHTTPBody: [soapMsg dataUsingEncoding:NSUTF8StringEncoding]]; 

    NSString* username = [settings usuario]; 
    NSString* password = [settings pass]; 

    NSString *authStr = [NSString stringWithFormat:@"%@:%@", username, password]; 
    NSData *authData = [authStr dataUsingEncoding:NSASCIIStringEncoding]; 
    NSString *authValue = [NSString stringWithFormat:@"Basic %@", [authData base64EncodingWithLineLength:80]]; 
    [myRequest setValue:authValue forHTTPHeaderField:@"Authorization"]; 


    signConnection = [[NSURLConnection alloc] initWithRequest:myRequest delegate:self]; 

    if(signConnection) { 
     webResponseData = [NSMutableData data]; 
    }else { 
     NSLog(@"Some error occurred in Connection"); 

    } 

aDocument가 있습니다 :

NSData *signData = [[NSFileManager defaultManager] contentsAtPath:self.pathDocument]; 
NSString *base64file = [signData base64EncodedString]; 

통화를 수행하려면이 내가 사용했던 코드 base64의 문서.

미리 감사드립니다.

+0

NSString은 메모리에 맞는 크기라면 어떤 크기라도 저장할 수 있습니다. 다른 곳에서 문제를 찾을 수 있습니다. 코드를 보여줘야합니다. – CouchDeveloper

답변

0

나는 문제를 해결했습니다 . 죄송합니다. 문제가 잘못 이해되었습니다. 내 모든 코드는 괜찮 았는데 문제는 업로드 할 수있는 파일의 최대 크기를 제어하는 ​​IIS의 서비스 매개 변수 때문이었습니다.

응용 프로그램이 디버그 모드로 인해 Xcode가 충돌하고 메모리에 오류가 발생했습니다. 디버거를 사용하지 않으면 디버거가 사용되지 않습니다.

모두에게 감사드립니다!

0

요청 본문이 아닌 첨부 파일 형태로 큰 리소스를 보내야합니다. AFNetworking 라이브러리는 동일한 기능을 사용할 준비가되었습니다.

+0

HTTP 메시지에는 "첨부 파일"같은 것이 없습니다. 몸은 대용량 데이터를 전송할 때 완벽하게 괜찮습니다. 아마도 "청크 분할 전송 인코딩"을 사용했을 것입니다. – CouchDeveloper

1

은 NO 그러한 클래스가 없다 ..하지만 당신은 1 일이 대신 큰 파일의 청크로 데이터를 생성 시도하고 스트림을 사용하여 서버에 데이터를 보낼 시도 할 수 있습니다 ..

+0

감사합니다, 데이터를 청크하는 방법을 몇 가지 예제를 찾으려고하지만 아무도 찾지 못했습니다, 내 코드 (2 분)로 질문을 편집합니다 – javiazo

+0

당신은 NSURLRequest'- (NSInputStream *) HTTPBodyStream'을 볼 수 있습니다. 스트림을 사용하여 데이터를 업로드하는 방법을 확인하는 기능. 이게 당신 문제에 많은 도움이되기를 바랍니다. – Dinesh

관련 문제