在iPhone上使用Objective-C来使用WCF Web服务

我在我的iPhone应用程序中很费时地使用一个非常简单的(Hello World)WCF Web服务。 从我读到的,你必须手动创build请求消息,然后将其发送到Web服务的URL。

我能够在.asmx Web服务上完成此操作,但不能使用WCF服务。

我如何知道请求SOAP消息的正确格式?

我尝试访问的Web服务格式为: http : //xxx.xxx.xxx.xxx : PORT/IService1/ (在VM中本地运行)

我对缺乏信息表示歉意,我很迷茫。

任何和所有的帮助,非常感谢。

感谢在这里帮助过的所有人。 我结束了想法,并认为我会分享我的结果。 我知道这不是一个全面的解决scheme,所以如果你需要更多的细节,请给我留言或评论。

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

我个人build议为WCF服务添加一个基于REST的端点。 您可以与SOAP同时运行它,并且更容易在iPhone端使用它。

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

当你打我们的WCF服务时,你会得到什么样的错误? 所以asmx工作,但不是WCF? 有一件事需要注意,在.NET 2.0中,Web服务(asmx)同时支持SOAP 1.1和SOAP 1.2消息。 但是,WCF中的basicHttpBinding只处理SOAP 1.1。 所以如果你使用basicHttpBinding从你的iPhone客户端发送SOAP 1.2消息到WCF服务,这可能是你遇到的问题。 为了支持SOAP 1.2,您需要使用wsHttpBinding或者创build一个与basicHttpBinding几乎相同的自定义绑定,但是您将消息版本指定为SOAP 1.2。

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

Caged / httpriot简单的HTTPrest库为iPhone和Cocoa项目。

您是否尝试从Windows客户端作为Web服务访问WCF服务? 我没有configurationWCF作为asmx风格的Web服务运行,但我相信有一些特定的设置,必须调整WCF才能像这样的行为。 使用Windows客户端可以将任何基于iPhone的问题排除在testing之外,并可帮助您将testing范围缩小到服务本身。

您需要确保您使用BasicHttpBinding(而不是WSHttpBinding),它更多的是不在.NET 3.0平台上的客户端。 此绑定不支持安全性,可靠性或有序交付。