5

ユーザー名とパスワードのフィールドと [送信] ボタンを含むフォームを作成する ASP.NET ページを使用して、Web サービスの呼び出しをテストしようとしています。(jQuery と私が使用している .js ファイルの両方が head 要素のスクリプト タグに含まれています。)

[送信] ボタンは、別の JavaScript ファイルを呼び出す C# コード ビハインド ファイルで作成された関数を呼び出します。

protected void mSubmit_Click(object sender, EventArgs eventArgs)
{
    String authenticate = String.Format("Authentication(\"{0}\",\"{1}\");", this.mUsername.Text,this.mPassword.Text);
    Page.ClientScript.RegisterStartupScript(this.GetType(), "ClientScript", authenticate, true);
}

JavaScript 関数 はAuthenticate、jQuery と Ajax を使用して別のサーバーに Web サービス呼び出しを行い、JSON パラメーターを送信し、応答として JSON が返されることを期待します。

function Authentication(uname, pwd) {

    //gets search parameters and puts them in json format
    var params = '{"Header":{"AuthToken":null,"ProductID":"NOR","SessToken":null,"Version":1},"ReturnAuthentication":true,"Password":"' + pwd + '","Username":"' + uname + '",”ReturnCredentials”:false }';

    var xmlhttp = $.ajax({
        async: false,
        type: "POST",
        url: 'https://myHost.com/V1/Identity/Authenticate',
        data: params,
        contentType: 'application/json'
    });

    alert(xmlhttp.statusText);
    alert(xmlhttp.responseText);

    return;
}

ただし、呼び出している Web サービスは ASP.NET、C#、および JavaScript ファイルとは別のサーバー上にあるため、statusTextまたはresponseText警告が表示されません。

どういうわけか、Web サービスに何も送信されず、何も返されず、エラーも返されません。属性に関数を入れてみましたbeforeSendが、起動しませんでした。サーバー外の Web サービスの呼び出しを処理するために必要な特別な方法はありますか?

アップデート!

jjnguy、Janie、Nathan のアドバイスを受けて、HttpWebRequest を使用して Web サービスへのサーバー側呼び出しを試みています。jjnguy のコードとこの質問のコードの一部を使用して、これを思いつきました。

public static void Authenticate(string pwd, string uname)
{
    string ret = null;

    HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://myhost.com/V1/Identity/Authenticate");
    request.ContentType = "application/json";
    request.Method = "POST";

    string data = "{\"Header\":{\"AuthToken\":null,\"ProductID\":\"NOR\",\"SessToken\":null,\"Version\":1},\"ReturnAuthentication\":true,\"Password\":\"" + pwd + "\",\"Username\":\"" + uname + "\",\"ReturnCredentials\":false }'";

    byte[] byteData = UTF8Encoding.UTF8.GetBytes(data);
    request.ContentLength = byteData.Length;

    using (Stream postStream = request.GetRequestStream()) 
    {
        postStream.Write(byteData, 0, byteData.Length);
    }

    HttpWebResponse response = (HttpWebResponse)request.GetResponse();

    using (response)
    {
        // Get the response stream  
        StreamReader reader = new StreamReader(response.GetResponseStream());

        // Console application output  
        ret = reader.ReadToEnd();
    }

    Console.WriteLine(ret);
}

ただし、(400) Bad RequestHttpWebRequest から応答を取得しようとすると、リモート サーバーからエラーが発生します。例外の Response プロパティの{System.Net.HttpWebResponse}値は、 Status プロパティの値は ですProtocolError。これは、URL が HTTP SSL プロトコルを使用しているためだと確信しています。ASP.NET ページの URL を HTTPS で開始する (オプションではない) 以外に、これを回避するにはどうすればよいですか?

4

4 に答える 4

3

アップデートで投稿したコードは正しかったことがわかりました。タイプミスと、データ文字列の設定が 1 つ間違っていました。

    string data = "{\"Header\":{\"AuthToken\":null,\"ProductID\":\"NOR\",\"SessToken\":null,\"Version\":1},\"ReturnAuthentication\":true,\"Password\":\"" + pwd + "\",\"Username\":\"" + uname + "\",\"ReturnCredentials\":true}";
于 2009-07-24T20:50:02.630 に答える
2

簡単にするために、サーバー側の C# で Web サービスへの呼び出しを記述してみませんか?

Javascript の場合と同じように、C# で要求を送信して応答を取得する機能があります。

C# での関数のクラックを次に示します。

public static string Authenticate(string pwd, string uname)
{
    HttpWebRequest requestFile = (HttpWebRequest)WebRequest.Create("https://myHost.com/V1/Identity/Authenticate");
    requestFile.ContentType = "application/json";
    requestFile.Method = "POST";
    StreamWriter postBody = new StreamWriter(requestFile.GetRequestStream())
    using (postBody) {
        postBody.Write("{\"Header\":{\"AuthToken\":null,\"ProductID\":\"NOR\",\"SessToken\":null,\"Version\":1},\"ReturnAuthentication\":true,\"Password\":\"" + pwd + "\",\"Username\":\"" + uname + "\",\"ReturnCredentials\":false }'");
    }
    HttpWebResponse serverResponse = (HttpWebResponse)requestFile.GetResponse();
    if (HttpStatusCode.OK != serverResponse.StatusCode)
        throw new Exception("Url request failed.  Connection to the server inturrupted");
    StreamReader responseStream = new StreamReader(serverResponse.GetResponseStream());
    string ret = null;
    using (responseStream) {
        ret = responseStream.ReadLine();
    }
    return ret;
}

免責事項これはテストされていません。

于 2009-07-23T21:11:15.363 に答える
1

クライアント スクリプトを使用してサーバーから要求を行う代わりに、サーバー側のコードを使用してリクエストを行う

編集して回答を展開します:

Visual Studio の Web プロジェクトから、[Web 参照の追加] をクリックし、クライアント スクリプトを介して最初にアクセスしていたサービスをポイントします (「https://myHost.com/V1/Identity/Authenticate 」だったと思います) 。

js の代わりに c# コードを使用してサービスと対話できるようになりました (そして、ユーザーが提供した資格情報を渡します)。

また、サービスに対するリクエストはブラウザではなくサーバーから送信されるため、適用されるクロスドメイン制限をバイパスします。

さらに編集して、追加のテクニックを表示します。

Visual Studio を使用してサービス プロキシを生成するという考えが気に入らない場合は、WebClient または HttpRequest を使用して自分でリクエストを作成できます。

WebClient: http://msdn.microsoft.com/en-us/library/system.net.webclient(VS.80).aspx

HttpWebRequest: http://msdn.microsoft.com/en-us/library/system.net.httpwebrequest(VS.80).aspx

于 2009-07-23T21:12:22.740 に答える
0

同じオリジンポリシーに遭遇しているようです

http://en.wikipedia.org/wiki/Same_origin_policy

回避する方法はあると思いますが、他のポスターは正しいと思います。サーバーで、HttpWebRequest を使用して Web サービスを呼び出すメソッドを作成し、JavaScriptSerializer を使用して JSON を解析します。私は午後のほとんどをこの原因の調査に費やしました。

>>>>  Nathan

PS 私は @Janie の計画の方が好きです... JSON を返す Web サービスと、XML を返す Web サービスでそれを行うことはできますか?

于 2009-07-23T21:32:49.467 に答える