views:

60

answers:

2

Hi,

I am trying to access a webservice (written in .NET) from my iPhone application.

This is my code:

-(IBAction)buttonClicked:(id)sender {

    NSString *postString =[NSString stringWithFormat:question];
    NSLog(postString);

    NSURL *url = [NSURL URLWithString: address+@"/execute"];
    NSMutableURLRequest *req = [NSMutableURLRequest requestWithURL:url];
    NSString *msgLength = [NSString stringWithFormat:@"%d", [postString length]];

    [req addValue:@"application/x-www-form-urlencoded" forHTTPHeaderField:@"Content-Type"];

    [req addValue:msgLength forHTTPHeaderField:@"Content-Length"];
    [req setHTTPMethod:@"POST"];
    [req setHTTPBody: [postString dataUsingEncoding:NSUTF8StringEncoding]];

    [activityIndicator startAnimating];

    conn = [[NSURLConnection alloc] initWithRequest:req delegate:self];
    if (conn) {
        webData = [[NSMutableData data] retain];
    }


}

-(void) connection:(NSURLConnection *) connection
didReceiveResponse:(NSURLResponse *) response {
    [webData setLength: 0];
}

-(void) connection:(NSURLConnection *) connection
    didReceiveData:(NSData *) data {
    [webData appendData:data];
}
-(void) connection:(NSURLConnection *) connection
  didFailWithError:(NSError *) error {
    [webData release];
    [connection release];
}

-(void) connectionDidFinishLoading:(NSURLConnection *) connection {
    NSLog(@"DONE. Received Bytes: %d", [webData length]);
    NSString *theXML = [[NSString alloc]
                        initWithBytes: [webData mutableBytes]
                        length:[webData length]
                        encoding:NSUTF8StringEncoding];
    //---shows the XML---
    NSLog(theXML);
    [theXML release];
    [activityIndicator stopAnimating];
    if (xmlParser)
    {
        [xmlParser release];
    }
    xmlParser = [[NSXMLParser alloc] initWithData: webData];
    [xmlParser setDelegate: self];
    [xmlParser setShouldResolveExternalEntities:YES];
    [xmlParser parse];

    [connection release];
    [webData release];
}

It's entering the didReceiveResponse and didReceiveData methods but the following text is retrieved instead of the data I want:

Runtime Error body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;} p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px} b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px} H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red } H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon } pre {font-family:"Lucida Console";font-size: .9em} .marker {font-weight: bold; color: black;text-decoration: none;} .version {color: gray;} .error {margin-bottom: 10px;} .expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; }

<body bgcolor="white">

        <span><H1>Server Error in '/' Application.<hr

width=100initWithBytes:length:encoding:ize=1 color=silver>

        <h2> <i>Runtime Error</i> </h2></span>

        <font face="Arial, Helvetica, Geneva, SunSans-Regular,

sans-serif ">

        <b> Description: </b>An application error occurred on the

server. The current custom error settings for this application prevent the details of the application error from being viewed remotely (for security reasons). It could, however, be viewed by browsers running on the local server machine.

        <b>Details:</b> To enable the details of this specific error

message to be viewable on remote machines, please create a <customErrors> tag within a "web.config" configuration file located in the root directory of the current web application. This <customErrors> tag should then have its "mode" attribute set to "Off".

        <table width=100 gcolor="#ffffcc">
           <tr>
              <td>
                  <code><pre>

<!-- Web.Config Configuration File -->

<configuration> <system.web> <customErrors mode="Off"/> </system.web> </configuration>

              </td>
           </tr>
        </table>

        <br>

        <b>Notes:</b> The current error page you are seeing can be

replaced by a custom error page by modifying the "defaultRedirect" attribute of the application's <customErrors> configuration tag to point to a custom error page URL.

        <table width=100 gcolor="#ffffcc">
           <tr>
              <td>
                  <code><pre>

<!-- Web.Config Configuration File -->

<configuration> <system.web> <customErrors mode="RemoteOnly" defaultRedirect="mycustompage.htm"/> </system.web> </configuration>

              </td>
           </tr>
        </table>

        <br>

</body> </html>

Can anyone please help me?

Thanks!

A: 

You get server side error. Check request parameters you send to a web-service from your iPhone app.

Aleksejs
A: 

You might have a conflict between the actual message length and the length set in the "Content-Length" header.

One is set by getting the length of the string and the other is set by getting a data using UTF8 encoding.

Claus Broch
Thanks for answering, so what would I need to change?
C.
Do you need to explicitly set the content-length?
Claus Broch
i commented out :[req addValue:msgLength forHTTPHeaderField:@"Content-Length"]; [req setHTTPBody: [postString dataUsingEncoding:NSUTF8StringEncoding]];and i still got the same error
C.
Then could be some malformed parameters in your post data. It's impossible to tell without knowing what it is supposed to be.
Claus Broch