3

この回答で問題を解決しようとしましたが、うまくいきません。

全体として、AJAX経由で(htmlページのjavascript経由で)アクセスしたい多くの機能を備えたWCFプロジェクトを作成しました。

以下は、私の Web サービス内の関数の例です:
iService

[OperationContract]
[WebInvoke(ResponseFormat = WebMessageFormat.Json)]
string GetStuff();

サービス

    public string GetStuff()
    {
        string url = string.Format("http://myapi.co.uk/api/mystuff");

        WebRequest myReq = WebRequest.Create(url);

        // Where USERNAME and PASSWORD are constants
        string usernamePassword = USERNAME + ":" + PASSWORD;
        CredentialCache mycache = new CredentialCache();
        mycache.Add(new Uri(url), "Basic", new NetworkCredential(USERNAME, PASSWORD));
        myReq.Credentials = mycache;
        myReq.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword)));

        WebResponse wr = myReq.GetResponse();
        Stream receiveStream = wr.GetResponseStream();

        StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8);
        string content = reader.ReadToEnd();

        return content;
    }

Streamまた、直接返品も試みましたのでご了承ください。

私のjavascriptとajaxに!

function getData()
{
  jQuery.support.cors = true;

  $.ajax({
      type: "GET",
      url: "http://localhost:15574/Service1.svc/GetStuff",
      contentType: "application/json; charset=utf-8",
      dataType: "jsonp",
      success: function(result) {
         alert(result);
      },
      error: function(msg) {
        alert("Fail: " + msg.status + ":" + msg.statusText);
      }
   });
}

エラーセクションにヒットしましたが、奇妙に成功エラーメッセージが表示されました...

エラーメッセージ

当初、問題は外部 API からの JSON の形式が正しくないためだと考えていましたが、完全に有効な JSON を返すように Web サービスを変更しようとしたところ、同じエラーが表示されました。前述したように、ストリームを返すように Web サービスを変更しようとしましたが、うまくいきませんでした。

これについて何か助けていただければ幸いです。私は非常に感謝しています。

アップデート

PS WCF テスト クライアントでは正常に動作しているようで、期待どおりの文字列を返します。
PPS ステータスを取得するためにエラー関数に別のパラメーターを追加したところ、parsererror PPPS を取得しています。エラーに渡される 3 番目のパラメーターは次のとおりです。jquery171014696656613195724_1341477967656 was not called

4

2 に答える 2

1

あなたdataType : 'jsonp'のjqueryコードにあります。callback=XXXXこれは、URL にa を追加するよう jQuery に指示します。

このダイアログのサーバー側は、そのコールバックで JSON の結果をラップする必要があります。しかし、あなたのコードはそれをしません。

本当にjsonpが必要ですか?

を使用してこれを修正できる場合がありますdataType: 'json'

于 2012-07-04T16:57:24.690 に答える
1

簡単な推測: 使用していますWebInvokeAttributeが、HTTP GET を使用してサービス操作を呼び出そうとしています。MethodのプロパティのWebInvokeAttribute既定値POST( MSDN )。に切り替えてみてくださいWebGetAttribute

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
string GetStuff();

Methodまたは、 のプロパティを にWebInvokeAttribute設定することもできますGET

アップデート

@Cheeso が述べたように、取得する「解析エラー」は、それ自体が有効な式ではない単純な JSON であるため、返されたデータを JavaScript エンジンが解釈できないという事実によるものです (あなたがそれを置くと想像してください)。<script></script>これは明らかに機能せず、これはまさにブラウザーがやろうとしていることです) 。

パラメータを尊重し、callback応答をラップして、パラメータを介して名前が渡される関数のパラメータになるようにする必要がありcallbackます。

// If the ASP.NET compatibility was enabled, you could safely use HttpContext.Current
// It's here just to demonstrate the idea
return string.Format("{0}({1});", HttpContext.Current.Request.QueryString["callback"], content);

または、AJAX 呼び出しを行うときに「dataType」を「json」に設定します。

于 2012-07-04T14:48:54.870 に答える