0

iOS から asp.net Web サービスに接続しようとしていますが、エラー 500 が発生します。Web サービスは、jQuery.ajax を使用して Web から接続しているが、iOS から接続していない場合は機能しています。接続を許可するためにサーバー側で設定する必要がある設定はありますか? 外部接続を許可していないセキュリティ設定がある可能性がありますか? Web サービスが json を返すことを確認するにはどうすればよいですか。URL をブラウザに直接入力しようとすると、webservices ディレクトリが取得され、webservice を呼び出すことができますが、エラーが発生します。ただし、すべてがウェブサイトから完全に機能しています。iOS側から使用しているコードは次のとおりです

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSDictionary *params = [NSDictionary dictionaryWithObjectsAndKeys: [NSDictionary dictionaryWithObjectsAndKeys:@"user", @"userName",@"test", @"password",nil],@"request",nil];
    AFHTTPClient *client = [[AFHTTPClient alloc] initWithBaseURL:
    [NSURL URLWithString:@"http://www.server.com"]];
    //[client setDefaultHeader:@"contentType" value:@"application/json; charset=utf-8"];
    client.parameterEncoding = AFJSONParameterEncoding;
    NSMutableURLRequest *request =
    [client requestWithMethod:@"POST" path:@"/mobile/user.asmx/login" parameters:params];
    NSLog(@"request %@",request);
    AFJSONRequestOperation *operation =
    [AFJSONRequestOperation JSONRequestOperationWithRequest:request
                                                            success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
    {
          NSLog(@"response %@",response);
          NSLog(@"JSON: %@", [JSON valueForKeyPath:@"LoginResult"]);
          NSLog(@"Code: %@", [[[JSON valueForKeyPath:@"LoginResult"] valueForKeyPath:@"Code"] stringValue]);
          NSLog(@"FaultString: %@", [[JSON valueForKeyPath:@"LoginResult"] valueForKeyPath:@"FaultString"]);
             }
             failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON)
             {
                 NSLog(@"error opening connection %d %@",response.statusCode, error);
                 NSLog(@"request %@",request);
             }];
[operation start];
}

これはウェブサイトで動作するコードです

$('#signin').click(function (e) {
            e.preventDefault();
            var user = $('#user').val();
            var password = $('#password').val();
            var holdval = "<ul>";
            if (user == null || user == "")
                holdval += "<li>Provide user name</li>";

            if (password == null || password == "")
                holdval += "<li>Provide password</li>";

            holdval += "</ul>";
            if (holdval != "<ul></ul>") {
                $('#msg').show();
                $('#msg').html(holdval);
                return;
            }

            var temp = new User(user, password);
            $("#loader").show();
            var jsontxt = JSON.stringify({ user: temp });
            jQuery.ajax({
                type: "POST",
                url: "/mobile/user.asmx/login", //http://www.server.com

                contentType: "application/json; charset=utf-8", 
                data: jsontxt,
                dataType: "json",
                success: OnSuccess,
                error: OnError
            });
        });

アップデート

Cory が示唆したように、wireshark を使用して http トラフィックをチェックしました。リクエストはGETリクエストであることが判明しましたが、まだこれを機能させることができません。問題は、ウェブサイトのリクエストがjsonデータをユーザー名とともに渡し、afnetworkingがユーザー名とパスワードのみを渡すことです

これは Web サイト http://www.server.com/user.asmx/loginuser {%22user%22:%22username%22,%22password%22:%22pass%22} からのものです。

これは iOS http://www.server.com/user.asmx/loginuser?password=pass&user=usernameからのものです

パラメータがjsonになっていないようです

iOSで使用している更新されたコードは次のとおりです

AFHTTPClient *httpClient = [[AFHTTPClient alloc] initWithBaseURL:[NSURL URLWithString:@"http://www.server.com/user.asmx/"]];
    [httpClient setParameterEncoding:AFJSONParameterEncoding];
    [httpClient setDefaultHeader:@"contentType" value:@"application/json; charset=utf-8"];
[httpClient getPath:@"loginuser" parameters:@{@"user":@"username",@"password":@"pass"} success:^(AFHTTPRequestOperation *operation, id responseObject) {
        NSLog(@"Response: %@", [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding]);

} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    NSLog(@"Error: %@", error);
}];

どんな提案でも大歓迎です!

UPDATE 2 afsjonrequestoperation を使用して上記の最初のコードにこれを追加した後

[client setAuthorizationHeaderWithUsername:USERNAME password:USER_PASSWORD]; //setting authorization header
[client requestWithMethod:@"POST" path:@"login/" parameters:nil]; //parameter nil
 [request setHTTPMethod:@"GET"];

操作を開始した後、エラーや応答はありませんが、wireshark を確認すると、401 Unauthorized が表示され、HTML で資格情報が無効であると表示されます。ユーザー名とパスワードが正しいと確信しています。これが私が以前よりもさらに一歩前進したかどうかはわかりません。ご意見をお聞かせください。再度、感謝します!

4

1 に答える 1