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.
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
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é.
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>
Caged/httpriot Bibliothèque de repos HTTP simple pour les projets iPhone et Cocoa.
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.
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.