0

WebApi を使い始めたばかりで、複数の問題があります。たくさんの情報を読みますが、おそらくいくつかの概念が欠けています。

私のコントローラーで:

    public IEnumerable<Product> GetProducts()
    {
        return db.Products.AsEnumerable();
    }


    public Product GetProduct(string name)
    {
        Product product = db.Products.FirstOrDefault(p => p.Name == name);
        if (product == null)
        {
            throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotFound));
        }

        return product;
    }

Javascript :

 $('#Search').click(function () {
    jQuery.support.cors = true;
    var productName = $('#Name').val();

    $.ajax({

        url: "http://localhost:62178/api/product",
        //url: "http://localhost:62178/api/product/" + productName,
        type: "GET",
        success: function (data) {
            alertData(data);
        }
    });
});

まず、パラメーター productName を渡しても、パラメーターのない GetProduct が呼び出されます (データが返されます)。これらの GET メソッドの両方を呼び出せるようにする必要があります。 次に、success 関数が呼び出されません。そのため、WebApi メソッドからデータを取得できません。

ヒントやガイダンスをいただければ幸いです。ありがとう。WebApiConfig.cs

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

今のところ唯一の問題は、データがアラートされないことです:

$('#Search').click(function () {
    jQuery.support.cors = true;
    var productName = $('#Name').val();

    $.ajax({

        url: "http://localhost:62177/api/product/" + productName,
        //data: { name: productName },
        type: "GET",
        dataType: "jsonp",
        error: function (request, status, error) {
            alert(request.responseText);
        },
        success: function (data) {
            alert(data);
        }
    });
});
4

5 に答える 5

4

メソッドの署名を次のいずれかに変更します

public Product GetProduct(string id)

またはあなたのルート

routeTemplate: "api/{controller}/{name}"

メソッド パラメータの名前によって、選択されるルートが決まります。

于 2013-03-06T06:51:36.060 に答える
0

これは、おそらく同じオリジン ポリシーによるものです。html ファイルを Visual Studio ソリューションに移動して (Visual Studio を使用していると仮定)、そこから実行してみてください (例: localhost:62177/test.htm)。この方法で結果を受け取った場合、同じオリジン ポリシーのブロックが確認されます。

于 2013-03-13T00:53:01.967 に答える
0

部分的な答え-jquery ajax呼び出しでデータパラメーターを設定する必要があり
、明確にするために-
おそらく「データ」を戻り変数として使用しないでください
(以下の「結果」に変更しました)
ので:

$.ajax({
    url: "http://localhost:62178/api/product",
    data: {name: productName},
    type: "GET",
    success: function (result) {
        alertData(result);
    }
});
于 2013-07-04T19:39:39.490 に答える
0

まず、コンソールにエラーが表示されないのはたまたま起こったので、Internet Explorer を使用して Web サイトを表示していると仮定していますが、Chrome で試してみると、エラーが表示されるはずです。コンソールのこれと同様:

XMLHttpRequest cannot load http://localhost:44271/api/routes/1. Origin http://localhost:27954 is not allowed by Access-Control-Allow-Origin. 

エラーが表示されない場合でも、Chrome の開発者ツールの [ネットワーク] タブでネットワーク呼び出しの結果を確認できます。ほとんどの場合、使用可能な応答がないため、次のように失敗した要求 (200 ステータスではありません) としてマークする必要があります。

ここに画像の説明を入力

MVC Web サイトが WebAPI とは別のプロジェクトにある場合、Visual Studio でデバッグを開始すると、IIS Express の別のアプリケーション (URL) にデプロイされます。

これは、 CORS ポリシーにより、WebAPI の呼び出しが禁止されることを意味します。

ただし、 ASP.NET チームが最近発表したWebAPI の Brock Allen の CORS 実装を使用することで、これを回避できます。これは、次のリリースで WebAPI に直接統合される予定です。

今日、単純な PoC を作成する必要があり、同じ問題が発生し、Brock の実装を使用して問題を解決しました。手順は非常に簡単です。

  1. ApiController を変更する必要はありません。
  2. CorsConfig クラスを App_Start フォルダーに追加します。
  3. その CorsConfig クラスへの呼び出しを、CORS サポートを登録する静的メソッドに追加します。
  4. これで、エラーは発生しなくなります。この CORS 構成では、すべてのメソッド、すべてのリクエスト、およびすべてのオリジンに対して CORS 呼び出しが許可されることに注意してください。PoCに使用しました。ライブラリの流暢な構成方法を使用して、より制限することができます。

CorsConfig.cs

public static void RegisterCors(HttpConfiguration httpConfig)
{
    WebApiCorsConfiguration corsConfig = new WebApiCorsConfiguration();

    // this adds the CorsMessageHandler to the HttpConfiguration’s
    // MessageHandlers collection
    corsConfig.RegisterGlobal(httpConfig);

    // this allow all CORS requests to the Products controller
    // from the http://foo.com origin.
    corsConfig.AllowAll();
}

Global.asax

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();
        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);

        CorsConfig.RegisterCors(GlobalConfiguration.Configuration);
    }
于 2013-04-26T16:48:09.330 に答える
-1

あなたのウェブAPIメソッドを装飾してみてください

[HttpGet]

そしてパラメータとして

[HttpGet]
public Product GetProduct([FromUri]string name)

そして、試してみてください

于 2013-03-06T06:28:32.500 に答える