Использование веб-службы WCF с использованием Objective-C на iPhone - PullRequest
37 голосов
/ 11 июня 2009

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

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

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

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

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

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

Ответы [ 6 ]

46 голосов
/ 13 июня 2009

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

//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
10 голосов
/ 13 июня 2009

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

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

2 голосов
/ 12 июня 2009

Какую ошибку вы получаете, когда обращаетесь к нашему сервису 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>   
1 голос
/ 28 мая 2010

Caged / httpriot Простая библиотека HTTP Rest для проектов iPhone и Cocoa.

0 голосов
/ 12 июня 2009

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

0 голосов
/ 11 июня 2009

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

...