1

G'day friends (私はアメリカ人ですが、G'day はクールに聞こえます)

最新の ASP.NET Web API と共に WCF Data Services 5.0 パッケージをインストールしたところ、非常に厄介な問題が発生しています。私が見つけた解決策は機能しているようです。

私の問題は、ホストアプリケーションがその$文字を含むリクエストを受け入れておらず、何を試してもリクエストをJsonpMediaTypeFormatter. そのため、フォーマッタが実際の問題を修正するかどうかはわかりません。

フィドラーを使用すると、リクエストが " " の " " ヘッダーで行われていることがわかりますが、これAccepts*/*私のフォーマッタを通過していないと思います。*/*MediaTypeHeaderValue

助けや提案をいただければ幸いです。


セットアップの完全な説明

2 つの ASP.NET Web アプリケーション プロジェクトで構成されるテスト用のサンドボックス ソリューションを作成しました。最初のプロジェクトが呼び出されClientApplication、2 番目のプロジェクトが呼び出されHostApplicationます (どちらが何をするかは推測できると思います)。それらのそれぞれは、異なる Web サイトと IP アドレスで私のローカル IIS によってホストされています。実際にサーバーを必要とせずに、物理的に完全に切り離されているかのように、できる限りそれらを作成しました。

ホスト アプリケーション

いくつかの基本的なテーブルを含む単純なデータベースへの単純な EDMX ファイルのマッピングがあり、空想は何もありません。次のようなサービスクラスもあります。

public class ODataService : DataService<Data.SandboxEntities>
{
    public static void InitializeService(DataServiceConfiguration config)
    {
        config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
        config.UseVerboseErrors = true;
        config.SetEntitySetAccessRule("Customers", EntitySetRights.All);
        config.SetEntitySetAccessRule("Employees", EntitySetRights.All);
        config.SetEntitySetAccessRule("RandomDatas", EntitySetRights.All);
        config.SetEntitySetAccessRule("Schedules", EntitySetRights.All);
        config.SetEntitySetAccessRule("Shifts", EntitySetRights.All);
    }
}

JsonpMediaTypeFormatterピーター・モーバーグの質問に関するコメントで使用されているものと同じコードを使用しています: JSONP with ASP.NET Web API

最後にJsonpMediaTypeFormatterGlobal.asaxファイルに登録しました:

    protected void Application_Start(object sender, EventArgs e)
    {
        var config = GlobalConfiguration.Configuration;
        config.Formatters.Insert(0, new JsonpMediaTypeFormatter());
    }

クライアント アプリケーション

すべてをまとめるために、クライアントアプリケーションに次のコードを含む非常に単純なページがあります。

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Service Client Application</title>
    <script src="Scripts/jquery-1.7.2.js" type="text/javascript"></script>
    <script type="text/javascript">
        function makeServiceCall()
        {
            try
            {
                /*
                $.getJSON('http://10.10.1.7/ODataService.svc/Customers?$format=json&$callback=?',
                function (response)
                {
                    $.each(response.d, function (index, value)
                    {
                        var div = document.createElement('div');
                        div.innerHTML = value.ClientName;
                        $('#result').append(div);
                    })
                });
                */

                $.ajax({
                    type: "POST",
                    url: "http://10.10.1.7/ODataService.svc/Customers",
                    dataType: "json",
                    contentType: "application/json",
                    success: function (result) { alert("Winning."); },
                    error: function (result) { alert("Losing..."); }
                });
            }
            catch (err)
            {
                alert(err);
            }
        }
    </script>
</head>
<body>
    <form id="MainForm" runat="server">
        <div id="result" style="border:1px solid black;background-color:#E8E8E8;"></div>
        <button onclick="makeServiceCall();return false;">Call Service</button>
    </form>
</body>
</html>

そこにコメント付きの JavaScript が少しあることに気付くかもしれません。これは、サービス呼び出しを行う 2 つの異なる方法を試した (どちらも機能しなかった) ためです。

再度、感謝します!ジェイソン

4

1 に答える 1

2

使用しようとしているJSONPヘルパーは、WebAPIで動作するように設計されています。サービスはWCFデータサービスを使用しています。それらは同じようなことをしますが、同じではありません。また、JSONPヘルパーはWCFデータサービスでは機能しません。動作するものはここで見つけることができます:http://archive.msdn.microsoft.com/DataServicesJSONP

WCF DS 5.0では、JSONの動作が変更されていることに注意してください。上のページのコメントは、5.0でも機能するようにコードを修正する方法を示しています。

于 2012-06-29T06:59:08.777 に答える