Подтвердить что ты не робот

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

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

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

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

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

Извиняюсь за недостаток информации, я довольно потерян.

Приветствуется всяческая помощь.

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

Ответ 3

Какую ошибку вы получаете, когда попадаете в нашу службу 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>   

Ответ 4

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

Ответ 5

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

Ответ 6

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