0

wsdl2objc ツールを使用して、objective-c から ASMX Web サービスを使用しようとしています。今のところ、温度変換 Web サービスを消費しようとしています。

このツールを使用して、サービスを利用するためのクライアント クラスが生成されました (このリンクを参考にしてコードを記述しました)。

ただし、「有効なアクション パラメータがないとリクエストを処理できません。有効な SOAP アクションを指定してください」という SOAP エラー メッセージが継続的に表示されます。

このエラー メッセージは、"SOAPAction" ヘッダーを要求ヘッダーに追加する必要があることを非常に明確に示していますが、この場合、この wsdl2objc ツールを使用して Web サービスを使用するためのクライアント クラスを生成するときに、その方法がわかりません。

私は長い間検索してきましたが、参照したすべてのリンクで、objective-c でこの状況が発生しているという言及はありませんでした。

以下の私のコードを確認してください:

- (IBAction)submitClicked:(id)sender {

    TempConvertSoap *binding = [TempConvertSvc TempConvertSoap];

    TempConvertSoapResponse* response;
    TempConvertSvc_CelsiusToFahrenheit* request = [[TempConvertSvc_CelsiusToFahrenheit alloc] init];
    request.Celsius =  self.txtCelcius.text;


    response = [binding CelsiusToFahrenheitUsingParameters:request];

    dispatch_async(dispatch_get_main_queue(), ^{
        [self processResponse:response];
    });

}

-(void) processResponse: (TempConvertSoapResponse *) soapResponse
{
    NSArray *responseBodyParts = soapResponse.bodyParts;
    id bodyPart;

    @try{
        bodyPart = [responseBodyParts objectAtIndex:0]; 

    }
    @catch (NSException* exception)
    {
        UIAlertView* alert = [[UIAlertView alloc]initWithTitle:@"Server Error"message:@"Error while trying to process request" delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [alert show];
        return;
    }

    if ([bodyPart isKindOfClass:[SOAPFault class]]) {

        NSString* errorMesg = ((SOAPFault *)bodyPart).simpleFaultString;
        UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Server Error" message:errorMesg delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [alert show];
    }
    else if([bodyPart isKindOfClass:[TempConvertSvc_CelsiusToFahrenheitResponse class]]) {
        TempConvertSvc_CelsiusToFahrenheitResponse* tempResponse = bodyPart;
        UIAlertView* alert = [[UIAlertView alloc]initWithTitle:@"Success!" message:[NSString stringWithFormat:@"Result is %@", tempResponse.CelsiusToFahrenheitResult] delegate:self cancelButtonTitle:@"OK" otherButtonTitles: nil];
        [alert show];

    }
}

このリンクを参照して、石鹸メッセージを手動で作成して呼び出しを行うことで Web サービスを直接消費しようとしましたが、asmx Web ページの HTML を応答として取得しています!! なんでこんな反応が返ってくるのか理解不能!! この段落の冒頭で参照されているリンクにあるこの特定のコード例を実行している間、コードを 1 行も変更していません。

私はiOSプログラミングにまったく慣れていないので、ばかげた間違いをしたり、非常に些細なことを見落としたりしている可能性があります。誰かが親切に助けてくれますか?

さらに情報が必要な場合はお知らせください。

ありがとうございました。

更新:
以下の Priya が示唆するように、setHttpCallUsingBody メソッドの soap アクション ヘッダー項目を確認しました。ただし、すでに設定されていることがわかります。しかし、それでも同じ障害メッセージが表示されます。以下のスクリーン クリップを確認してください。ソープアクションが間違っていませんか?それは何か違うものであるべきですか?

ここに画像の説明を入力

4

2 に答える 2

0

SOAPAction ヘッダーは SOAP 1.1 に含まれていました。使用しようとしている Web サービスはこれを使用し、このヘッダーを期待しているようです。このヘッダーの詳細については、http://www.w3.org/TR/2000/NOTE-SOAP-20000508/#_Toc478383528を参照してください。

NSURLRequest に HTTP ヘッダーを追加するのは非常に簡単です。あなたが使用する -(void)setValue:(NSString *)value forHTTPHeaderField:(NSString *)fieldそれは NSURLMutableRequest で定義されています。

具体的には、私の記事で説明した wsdl2objc ツールを使用している場合は、このヘッダーを- (void)sendHTTPCallUsingBody:(NSString *)outputBody soapAction:(NSString *)soapAction forOperation:(BarracudaCloudAPIBindingOperation *)operationBarracudaCloudAPISvc.m ファイルのメソッドに含めることができます。

于 2014-04-14T17:39:20.407 に答える