Использование веб-службы WCF с использованием Objective-C на iPhone

Мне трудно использовать очень простой (Hello World) веб-сервис WCF в моем приложении для iPhone. Из того, что я прочитал, вы должны вручную создать сообщение с запросом, а затем отправить его по URL-адресу веб-службы.

Мне удалось сделать это на веб-службе.asmx, но не с помощью службы WCF.

Как узнать правильный формат сообщения SOAP с запросом?

Веб-служба, на которую я пытаюсь попасть, имеет формат: http://xxx.xxx.xxx.xxx:PORT/IService1/ (работает локально на виртуальной машине)

Я прошу прощения за отсутствие информации, я довольно потерян.

Любая помощь очень ценится.

6 ответов

Решение

Спасибо всем, кто помог здесь. Я понял это и подумал, что поделюсь своими результатами. Я знаю, что это не всеобъемлющее решение, поэтому напишите мне сообщение или комментарий, если вам нужно больше подробностей.

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

Лично я бы рекомендовал добавить конечную точку на основе REST для службы WCF. Вы можете запустить его одновременно с SOAP, и это намного проще для использования на стороне iPhone.

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

Какую ошибку вы получаете, когда обращаетесь к нашему сервису WCF? Так работает asmx, но не WCF? Следует обратить внимание на то, что в.NET 2.0 веб-сервисы (asmx) поддерживают сообщения SOAP 1.1 и SOAP 1.2. Однако basicHttpBinding в WCF обрабатывает только SOAP 1.1. Поэтому, если вы отправляете сообщения SOAP 1.2 с вашего iPhone-клиента в службу WCF с помощью basicHttpBinding, это вполне может быть вашей проблемой. Чтобы поддерживать SOAP 1.2, вам нужно использовать wsHttpBinding или создать пользовательскую привязку, почти такую ​​же, как basicHttpBinding, но вы указываете версию сообщения как SOAP 1.2.

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

Caged / httpriot Simple HTTP Rest Library для проектов iPhone и Какао.

Вы должны убедиться, что вы используете BasicHttpBinding (не WSHttpBinding), который больше ориентирован на клиентов, не работающих на платформе.NET 3.0. Эта привязка не поддерживает безопасность, надежность или заказанную доставку.

Вы пытались получить доступ к службе WCF в качестве веб-службы из клиента Windows? Я не настроил WCF для работы в качестве веб-службы в стиле asmx, но я считаю, что есть некоторые конкретные параметры, которые необходимо настроить, чтобы WCF действовал таким образом. Работа с Windows-клиентом исключит любые проблемы, связанные с iphone, для целей тестирования и поможет вам сузить тестирование до самой службы.

Другие вопросы по тегам