web-dev-qa-db-ja.com

iPhoneでObjective-Cを使用してWCF Webサービスを使用する

IPhoneアプリで非常にシンプルな(Hello World)WCF Webサービスを使用するのに苦労しています。私が読んだものから、要求メッセージを手動で作成し、WebサービスURLに送信する必要があります。

.asmx Webサービスでこれを達成できましたが、WCFサービスではできませんでした。

リクエストSOAP=メッセージの正しい形式を知るにはどうすればよいですか?

ヒットしようとしているWebサービスの形式は次のとおりです。 http://xxx.xxx.xxx.xxx:PORT/IService1/ (VMでローカルに実行)

情報不足をおpoびします。かなり迷ってしまいました。

ありとあらゆる助けに感謝します。

37
JWD

ここで助けてくれたみんなに感謝します。私は結局それを理解し、自分の結果を共有すると思いました。これが包括的なソリューションではないことを知っているので、詳細が必要な場合はメッセージまたはコメントを送ってください。

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

個人的には、WCFサービスにRESTベースのエンドポイントを追加することをお勧めします。SOAPとそのLOTをiPhoneで消費するのがより簡単に同時に実行できます側。

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

10
Lounges

WCFサービスにアクセスすると、どのようなエラーが発生しますか?それでは、asmxは機能していますが、WCFは機能していませんか?注意が必要なことの1つは、.NET 2.0では、Webサービス(asmx)がSOAP 1.1とSOAP 1.2の両方のメッセージをサポートしたことです。ただし、WCFのbasicHttpBindingはSOAP 1.1のみを処理します。したがって、basicHttpBindingを使用してiPhoneクライアントからWCFサービスにSOAP 1.2メッセージを送信している場合、これが問題になっている可能性が非常に高くなります。 SOAP 1.2をサポートするには、wsHttpBindingを使用するか、basicHttpBindingとほぼ同じカスタムバインディングを作成する必要がありますが、メッセージバージョンをSOAP 1.2に指定します。

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

Caged/httpriot iPhoneおよびCocoaプロジェクト用のシンプルなHTTP Restライブラリ。

1
yasirmturk

WindowsクライアントからWebサービスとしてWCFサービスにアクセスしようとしましたか? WCFをasmxスタイルのWebサービスとして実行するように構成していませんが、WCFがそのように動作するように微調整する必要がある特定の設定があると思います。 Windowsクライアントを使用すると、テスト目的でiphoneベースの問題を画像から取り除くことができ、テストをサービス自体に絞り込むことができます。

0
Chris Porter

.NET 3.0プラットフォーム上にないクライアントをより多く目的としているBasicHttpBinding(WSHttpBindingではない)を使用していることを確認する必要があります。このバインディングは、セキュリティ、信頼性、または順序付き配信をサポートしていません。

0
Momin