2009-07-23 12 views
5

を使用してJavaScriptを使用して外部のサーバー上でwebserviceを呼び出してください。ユーザー名とパスワードのフィールドと「送信」ボタンを含むフォームを作成するASP.NETページを使用してWebサービス呼び出しをテストしようとしています。 (私が使用しているjQueryと.jsファイルは、head要素のscriptタグに含まれています)。asp.netとC#

「送信」ボタンは、C#コードビハインドファイルで作成された別のJavaScriptファイル。

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、JSONパラメータを送信し、応答に戻ってJSONを期待して、別のサーバーへのjQueryとAjaxを使用して、Webサービスの呼び出しを行います。私が呼んでいるWebサービスはASP.NET、C#とJavaScriptファイルとは別のサーバー上にあるため

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; 
} 

しかし、私はstatusTextまたはresponseText警告が届きません。

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

UPDATE! jjnguy、Janieとネイサンのアドバイスで

、私は今のHttpWebRequestを使用してWebサービスにサーバー側の呼び出しをしようとしています。 jjnguyのコードの一部とthis questionのコードを使って、私はこれを思いついた。私は私のHttpWebRequestのからの応答を取得しようとすると、

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 Requestエラーを取得しています。例外のResponseプロパティの値は{System.Net.HttpWebResponse}で、Statusプロパティの値はProtocolErrorです。 URLがHTTP SSLプロトコルを使用しているためですASP.NETページURLが(オプションではなく)HTTPSで始めるのではなく、これを回避するために何ができるのですか?

+0

これはRube Goldbergスタイルのソリューションであり、大幅に簡素化する必要があります。 – Janie

+0

合意。私たちは同じページにいるとうれしいです。 – jjnguy

+0

ブラウザからサービスを見ることができますか? – Janie

答えて

3

私の更新で掲載したコードが正しいことが判明しました。私はちょうど誤植とデータ文字列の1つの設定がありました。

string data = "{\"Header\":{\"AuthToken\":null,\"ProductID\":\"NOR\",\"SessToken\":null,\"Version\":1},\"ReturnAuthentication\":true,\"Password\":\"" + pwd + "\",\"Username\":\"" + uname + "\",\"ReturnCredentials\":true}"; 
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; 
} 

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

+0

私はあなたがそこにブロックを使用していくつかを入れるつもりだと思う。私は2つの票に下っています - あなたに私を使ってはいけません... –

+0

私の川を大丈夫にしてください。 – jjnguy

+0

p.s.私はC#でうまくいきません。 – jjnguy

1

クライアントスクリプトを使用してサーバーからの要求を行うのではなく、答え展開する要求に

EDITを作るために、サーバー側のコードを使用します。Visual StudioでWebプロジェクトから

、あなたが最初にあなたのクライアントスクリプト経由でアクセスしていたサービスへのWeb参照、およびポイントの追加]をクリックします:(Iそれは信じていた 'https://myHost.com/V1/Identity/Authenticate

これで、jsの代わりにc#コードを使用してサービスと話すことができました。)

また、サービスに対する要求はブラウザではなくサーバーからのものであるため、適用されるドメイン間の制限をバイパスします。追加の技術を示すために

FURTHER EDIT:

あなたはあなたのためのサービスプロキシを生成するには、Visual Studioを使用しての考えを好きではない場合、あなたは要求を手作りすることができ、自分が

をWebクライアントを使用するかのHttpRequest Webクライアント: 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

+0

Webプロジェクトでそのサービスにアクセスできません。私のファイルがある場所とは異なるコードベースの部分にあります。 –

+0

私はそれを理解しています。 VSは、あなたの代わりにそのサービスと対話するプロキシオブジェクトを生成します。あなたはその上のすべてのメソッドにアクセスするでしょう... – Janie

+0

詳細についてはjjnguyのソリューションを見てください... – Janie

0

らしいですiginポリシー

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

私はそれを回避する方法があると信じていますが、私は他のポスターが正しいと思います。サーバー上でHttpWebRequestを使用してWebサービスを呼び出し、JavaScriptSerializerを使用してJSONを解析するメソッドを記述します。私は午後のほとんどをこのような理由で研究していました。私はこれと似たようなものを書く必要があります。

>>>> Nathan 

P.S. @ Janieさんの計画がより好きです... JSONとXMLを返すWebサービスを返すことができますか?

+0

@ jjnguyさんの計画はどうですか? – jjnguy

+0

JavaScriptSerializerを追加しませんでした。/jk JSONサービスのプロキシクラスを作成できるかどうかはまだ不思議です...私のマシンでは動作しないようです... – Nathan