Interacción de iPhone con ASP.NET WebService

Tengo que desarrollar una aplicación que solicitará a un servicio web desarrollado en ASP.NET.

No sé, ¿cuál es el código de creación de una solicitud al servicio web asp.net?

¿Cómo responderá el servicio web asp.net a la aplicación iPhone?

¿Cómo iPhone analizará esa respuesta de la manera correcta?

Ya leí esta pregunta


¿Cómo obtener datos de un servicio web en iPhone?


Pero el enlace dado solo da el archivo .pdf.

Mi necesidad es el código de muestra, que puede explicar cómo hacer la conexión y recuperar datos del servicio web asp.net.

En realidad, puedes crear un servicio web y hacerlo realmente fácil de integrar en tu iphone. Sugeriría que si usa .net para crear un servicio WCF con ofertas webHttp e implemente métodos get y post, puede obtener respuestas en json y xml (hay un conjunto de clases para analizar Json en el iphone que analizará el responden muy rápido, están disponibles en la web), con poca configuración podrás realizar y publicar desde el iphone usando NSURLRequest. Aquí hay un artículo que habla sobre cómo hacer un servicio de wcf tranquilo http://www.developer.com/net/article.php/10916_3695436_2 . También es muy fácil agregar autenticación y seguridad a sus servicios con WCF.

Hessian es mucho mejor protocolo de comunicación que XML. Al ser un formato binario, es aún más compacto, y con un formato de análisis estricto es mucho más rápido.

Como beneficio adicional, ya existen marcos para Java, .NET y PHP para exponer un servicio web. Verdaderamente fácil. Asum que tiene esta interfaz C #:

public interface ITest { public string getGreeting(); int addNumbers(int a, int b); } 

Luego implementarlo en el servidor usando HessianC # es muy fácil:

 public class CTest:CHessianHandler, ITest { public string getGreeting() { return "Hello World!"; } public int addNumbers(int a, int b) { return a + b; } [STAThread] private static void Main(string[] args) { CWebServer web = new CWebServer(5667, "/test/test.hessian", typeof (CTest)); web.Paranoid = true; web.AcceptClient("[\\d\\s]"); web.Run(); for (;; ) { if (Console.ReadLine() != "") { web.Stop(); break; } } } } 

En el lado del iPhone, la interfaz C # debe traducirse a un protocolo Objective-C:

 @protocol ITest -(NSString*)getGreeting; -(int)addNumbers:(int)a :(int)b; @end 

Y luego, usar HessianKit para obtener un proxy para el servicio es casi igual de fácil:

 id proxy = [CWHessianConnection proxyWithURL:serviceURL protocol:@protocol(ITest)]; NSLog(@"Greeting: %@", [proxy getGreeting]); NSLog(@"The answer: %d", [proxy addNumbers:40 :2]); 

En esta breve respuesta, los nombres de los métodos no son del todo C # -ish, tampoco del todo Obj-C-ish. Esto se debe a que, por defecto, HessianKit usa las convenciones de nomenclatura de Java. Esto se puede anular en HessianKit proporcionando el método y las traducciones del nombre del tipo. De modo que tanto el lado C # como el lado Obj-C de la conexión se sienten al 100% en casa. Por ejemplo:

 [CWHessianArchiver setClassName:@"com.mycompany.ITest" forProtocol:@protocol(CWTest)]; [CWHessianArchiver setMethodName:@"AddNumbers" forSelector:@selector(addInt:toInt:)]; 
 - (void)viewDidLoad { [super viewDidLoad]; // create a soap Message which is given in your required web service NSString *soapMessage=@"< ?xml version=\"1.0\" encoding=\"utf-8\"?>\n" "\n" "\n" "\n" "\n" ""; // create a url to your asp.net web service. NSURL *tmpURl=[NSURL URLWithString:[NSString stringWithFormat:@"http://192.168.32.10/Itavema/Admin/Itavema_Service.asmx"]]; // create a request to your asp.net web service. NSMutableURLRequest *theRequest=[NSMutableURLRequest requestWithURL:tmpURl]; // add http content type - to your request [theRequest addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; // add SOAPAction - webMethod that is going to be called [theRequest addValue:@"http://tempuri.org/GetCategory" forHTTPHeaderField:@"SOAPAction"]; // count your soap message lenght - which is required to be added in your request NSString *msgLength=[NSString stringWithFormat:@"%i",[soapMessage length]]; // add content length [theRequest addValue:msgLength forHTTPHeaderField:@"Content-Length"]; // set method - post [theRequest setHTTPMethod:@"POST"]; // set http request - body [theRequest setHTTPBody:[soapMessage dataUsingEncoding:NSUTF8StringEncoding]]; // establish connection with your request & here delegate is self, so you need to implement connection's methods NSURLConnection *con=[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]; // if connection is established if(con) { myWebData=[[NSMutableData data] retain]; // here -> NSMutableData *myWebData; -> declared in .h file } } // a method when connection receives response from asp.net web server -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { [myWebData setLength: 0]; } // when web-service sends data to iPhone -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { [myWebData appendData:data]; } // when there is some error with web service -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { [connection release]; } // when connection successfully finishes -(void)connectionDidFinishLoading:(NSURLConnection *)connection { // check out your web-service retrieved data on log screen NSString *theXML = [[NSString alloc] initWithBytes: [myWebData mutableBytes] length:[myWebData length] encoding:NSUTF8StringEncoding]; NSLog(@"%@",theXML); [theXML release]; // if parser isn't nil. here NSXMLParser *myXMLParser; in .h file if( myXMLParser ) { [myXMLParser release]; } // supply your responded data to xmlParser - xmlParser will parse xmlData & then you can use it myXMLParser = [[NSXMLParser alloc] initWithData: myWebData]; // here delegate self means implement xmlParse methods [myXMLParser setDelegate: self]; [myXMLParser setShouldResolveExternalEntities: YES]; // parse method - will invoke xmlParserMethods [myXMLParser parse]; [connection release]; [myWebData release]; } //#pragma mark xmlParser // suppose myData is the xmlData // this function will read "" & tag attributes -(void)parser:(NSXMLParser*)parser didStartElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName attributes:(NSDictionary*)attributeDict { if([elementName isEqualToString:@"GetCategoryResult"]) { // here categoryArray is NSMutable array declared in .h file. // init your array when root element / document element is found CategoryArray=[[NSMutableArray alloc]init]; } else if([elementName isEqualToString:@"Prop_Category"]) { aCategory=[[Category alloc] init]; // if a tag has attribues like  //aCategory.ID=[attributeDict objectForKey:@"id"]; } } // suppose myData is the xmlData // this function will read "myData" & tag attributes -(void)parser:(NSXMLParser*)parser foundCharacters:(NSString*)string { // here currentElementValue is an NSMutableString declared in .h file // store read characters in that mutable string & then add to your object. if(!currentElementValue) { currentElementValue=[[NSMutableString alloc] initWithString:string]; } else { [currentElementValue appendString:string]; } } // suppose myData is the xmlData // this function will read "" & tag attributes -(void)parser:(NSXMLParser*)parser didEndElement:(NSString*)elementName namespaceURI:(NSString*)namespaceURI qualifiedName:(NSString*)qualifiedName { if([elementName isEqualToString:@"GetCategoryResult"]) { // if end of root element is found- ie end of your xml file. return; } else if([elementName isEqualToString:@"Prop_Category"]) { // end of a single data element // suppose  // 10 //  //  // when we found  we have finished entire category object. // here we have an object aCategory -> created custom class "Category" // CategoryClass -> NSString *name; NSInteger id; // Note: "important" //->class variables must be same as tag // now after reading entire object add to your mutable array // now this mutable array can be used for Table, UIPicker [CategoryArray addObject:aCategory]; [aCategory release]; aCategory=nil; [CategoryTable reloadData]; } else { // which is equivalent to aCategory.id=10 & aCategory.name=@"sagar" [aCategory setValue:currentElementValue forKey:elementName]; // remove previously read data [currentElementValue release]; currentElementValue=nil; } } 

Si no se está integrando con ASP.NET en ambos lados, probablemente evitaré un ‘servicio web’ específicamente, y solo generaré su propio formato XML, y lo procesaré adecuadamente en el lado del iPhone con una lib de XML.

esta respuesta está pasada de moda, pero por el protocolo:

He estado usando sudzc.com para convertir mi servicio web a clases Objective-C.

Funciona muy bien y simplifica enormemente las cosas.

Saludos, Oded.

Prueba wcf buddy, te permite crear fácilmente un SOAP webService al que puedes llamar desde cualquier lugar