web-dev-qa-db-fra.com

Consommer le service Web WCF à l'aide d'Objective-C sur iPhone

J'ai du mal à consommer un service Web WCF très simple (Hello World) dans mon application iPhone. D'après ce que j'ai lu, vous devez créer manuellement le message de demande, puis l'envoyer à l'URL du service Web.

J'ai pu accomplir cela sur un service Web .asmx, mais pas avec un service WCF.

Comment puis-je connaître le format correct de la demande SOAP message?

Le service Web que j'essaye de toucher a un format de: http://xxx.xxx.xxx.xxx:PORT/IService1/ (exécuté localement dans une VM)

Je m'excuse pour le manque d'informations, je suis assez perdu.

Toute aide est très appréciée.

37
JWD

Merci à tous ceux qui ont aidé ici. J'ai fini par comprendre et j'ai pensé partager mes résultats. Je sais que ce n'est pas une solution complète, alors envoyez-moi un message ou un commentaire si vous avez besoin de plus de détails.

//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
46
JWD

Personnellement, je recommanderais d'ajouter un point de terminaison basé sur REST pour le service WCF. Vous pouvez l'exécuter simultanément avec le SOAP et son beaucoup plus facile à consommer sur l'iPhone) côté.

http://msdn.Microsoft.com/en-us/library/dd203052.aspx

10
Lounges

Quel genre d'erreur obtenez-vous lorsque vous accédez à notre service WCF? Donc asmx fonctionne mais pas WCF? Une chose à laquelle vous devez faire attention est que dans .NET 2.0, les services Web (asmx) prennent en charge les messages SOAP 1.1 et SOAP 1.2. Cependant, basicHttpBinding dans WCF ne gère que SOAP 1.1. Donc, si vous envoyez des messages SOAP 1.2 de votre client iPhone au service WCF avec basicHttpBinding, cela pourrait très bien être le problème que vous rencontrez. Pour prendre en charge SOAP 1.2, vous devez utiliser wsHttpBinding ou créer une liaison personnalisée à peu près la même que basicHttpBinding mais vous spécifiez que la version du message est SOAP 1.2.

<customBinding>
  <binding name="customHttpBindingWithSoap12">
     <textMessageEncoding messageVersion="Soap12"/>
     <httpTransport />              
  </binding>
</customBinding>   
2
Mehmet Aras

Caged/httpriot Bibliothèque de repos HTTP simple pour les projets iPhone et Cocoa.

1
yasirmturk

Avez-vous essayé d'accéder au service WCF en tant que service Web à partir d'un client Windows? Je n'ai pas configuré WCF pour qu'il s'exécute en tant que service Web de style asmx, mais je crois qu'il y a certains paramètres spécifiques qui doivent être modifiés pour que WCF agisse de la même manière. Travailler avec un client Windows éliminerait tous les problèmes liés à l'iPhone à des fins de test et vous aiderait à limiter vos tests au service lui-même.

0
Chris Porter

Vous devez vous assurer que vous utilisez BasicHttpBinding (et non WSHttpBinding) qui vise davantage les clients qui ne sont pas sur la plate-forme .NET 3.0. Cette liaison ne prend pas en charge la sécurité, la fiabilité ou la livraison commandée.

0
Momin