【问题标题】:NSString is being truncatedNSString 被截断
【发布时间】:2013-12-09 13:42:07
【问题描述】:

在我的应用程序中,我正在使用签署文档的网络服务。我必须在 SOAP 调用中以 base64format 发送文档。问题是当我尝试发送一个像 11mb 这样的大文档时,base64(存储在 NSString 中)太大并且 SOAP 消息被截断。

因此,我可以正确发送 SOAP 调用并收到服务器错误。

有没有可以存储大(非常大)字符串的类?

编辑:这是我使用的代码:

要将文档转换为base64:

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

执行调用:

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是base64格式的文档。

提前致谢!

【问题讨论】:

  • NSString 可以存储任何大小,只要它适合内存。您可能会在其他地方找到您的问题。你应该展示你的代码。

标签: ios soap nsstring truncate string-length


【解决方案1】:

不,没有这样的课程.. 但你可以尝试 1 件事 尝试以块而不是大文件的形式创建数据,然后使用流将数据发送到服务器..

【讨论】:

  • 谢谢,我正在尝试寻找一些如何分块数据的示例,但我没有找到任何人,我将用我的代码编辑问题(2 分钟)
  • 你可以查看 NSURLRequest - (NSInputStream *)HTTPBodyStream 函数来检查如何使用流上传数据。我希望这对您的问题有很大帮助..
【解决方案2】:

您应该以附件的形式发送如此大的资源,而不是作为请求正文。 AFNetworking 库提供了即用型功能。

【讨论】:

  • HTTP 消息中没有“附件”之类的东西。主体非常适合发送大量数据,可能使用“分块传输编码”。
【解决方案3】:

我已经解决了这个问题。 对不起,我误解了这个问题。我所有的代码都没问题,问题是由于一个服务参数(在 IIS 中)控制了可以上传的文件的最大大小。

由于应用程序处于调试模式,Xcode 崩溃并在内存上失败。如果不使用调试器,则不会。

谢谢大家!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-04
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    • 2014-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多