objective - arkit iphone
Consumir el servicio web de WCF usando Objective-C en iPhone (6)
Me está costando mucho consumir un servicio web WCF muy simple (Hello World) en mi aplicación para iPhone. Por lo que he leído, debe crear manualmente el mensaje de solicitud y luego enviarlo a la URL del servicio web.
Pude lograr esto en un servicio web .asmx, pero no con un servicio WCF.
¿Cómo sé el formato correcto del mensaje SOAP de solicitud?
El servicio web al que trato de acceder tiene un formato de: http://xxx.xxx.xxx.xxx:PORT/IService1/ (se ejecuta localmente en una VM)
Me disculpo por la falta de información, estoy bastante perdido.
Cualquier ayuda es muy apreciada.
¿Has intentado acceder al servicio WCF como un servicio web desde un cliente de Windows? No configuré WCF para que se ejecute como un servicio web de estilo asmx, pero creo que hay algunas configuraciones específicas que deben modificarse para que WCF actúe de esa manera. Trabajar con un cliente de Windows eliminaría cualquier problema basado en el iPhone fuera de la imagen para fines de prueba y lo ayudaría a reducir las pruebas al servicio en sí.
¿Qué tipo de error está recibiendo cuando accede a nuestro servicio WCF? Entonces, ¿asmx está funcionando pero no WCF? Una cosa que necesita prestar atención es que en .NET 2.0, los servicios web (asmx) admiten los mensajes SOAP 1.1 y SOAP 1.2. Sin embargo, basicHttpBinding en WCF solo maneja SOAP 1.1. Entonces, si está enviando mensajes SOAP 1.2 desde su cliente de iPhone al servicio WCF con basicHttpBinding, este podría ser el problema que está teniendo. Para admitir SOAP 1.2, debe usar wsHttpBinding o crear un enlace personalizado más o menos igual que basicHttpBinding, pero especifique que la versión del mensaje sea SOAP 1.2.
<customBinding>
<binding name="customHttpBindingWithSoap12">
<textMessageEncoding messageVersion="Soap12"/>
<httpTransport />
</binding>
</customBinding>
Debe asegurarse de estar utilizando BasicHttpBinding (no WSHttpBinding), que está dirigido más a los clientes que no están en la plataforma .NET 3.0. Este enlace no admite seguridad, fiabilidad o entrega ordenada.
Gracias a todos los que ayudaron aquí. Terminé descifrándolo y pensé que compartiría mis resultados. Sé que esta no es una solución completa, así que envíeme un mensaje o comentario si necesita más detalles.
//Variables used
NSMutableData *webData;
NSMutableString *soapResults;
NSXMLParser *xmlParser;
BOOL recordResults;
//Web Service Call
NSString *soapMessage = [NSString stringWithFormat:
@"<?xml version=/"1.0/" encoding=/"UTF-8/"?>/n"
"<SOAP-ENV:Envelope /n"
"xmlns:xsd=/"http://www.w3.org/2001/XMLSchema/" /n"
"xmlns:xsi=/"http://www.w3.org/2001/XMLSchema-instance/" /n"
"xmlns:SOAP-ENC=/"http://schemas.xmlsoap.org/soap/encoding//" /n"
"SOAP-ENV:encodingStyle=/"http://schemas.xmlsoap.org/soap/encoding//" /n"
"xmlns:SOAP-ENV=/"http://schemas.xmlsoap.org/soap/envelope//"> /n"
"<SOAP-ENV:Body> /n"
"<Login xmlns=/"http://tempuri.org//"><username>JACKSON</username><password>PASSWORD</password>"
"</Login> /n"
"</SOAP-ENV:Body> /n"
"</SOAP-ENV:Envelope>"];
NSURL *url = [NSURL URLWithString:@"http://172.16.0.142:8731/Service1/"];
NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];
[theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
[theRequest addValue: @"http://tempuri.org/IService1/Login" forHTTPHeaderField:@"Soapaction"];
[theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];
[theRequest setHTTPMethod:@"POST"];
[theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];
if(theConnection) {
webData = [[NSMutableData data] retain];
}
else {
NSLog(@"theConnection is NULL");
}
//Implement the NSURL and XMLParser protocols
#pragma mark -
#pragma mark NSURLConnection methods
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
- (void)connectionDidFinishLoading:(NSURLConnection *)connection
#pragma mark -
#pragma mark XMLParser methods
-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
attributes:(NSDictionary *)attributeDict
-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string
-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
Personalmente, recomendaría agregar un punto final basado en REST para el servicio WCF. Puede ejecutarlo simultáneamente con el SOAP y es mucho más fácil de consumir en el lado del iPhone.
Caged / httpriot Simple HTTP Rest Library para proyectos de iPhone y Cocoa.