14

asp.net webapi Post メソッドを実行するリクエストを作成していますが、リクエスト変数を取得できません。

リクエスト

jQuery.ajax({ url: sURL, type: 'POST', data: {var1:"mytext"}, async: false, dataType: 'json', contentType: 'application/x-www-form-urlencoded; charset=UTF-8' })
    .done(function (data) {
        ...
    });

Web API Fnx

    [AcceptVerbs("POST")]
    [ActionName("myActionName")]
    public void DoSomeStuff([FromBody]dynamic value)
    {
        //first way
        var x = value.var1;

        //Second way
        var y = Request("var1");

    }

i どちらの方法でも var1 コンテンツを取得できません... (そのためのクラスを作成しない限り)

どうすればいいですか?

4

5 に答える 5

23

最初の方法:

    public void Post([FromBody]dynamic value)
    {
        var x = value.var1.Value; // JToken
    }

value.Property実際にはインスタンスを返すことに注意してください。そのJToken値を取得するには、呼び出す必要がありますvalue.Property.Value

2 番目の方法:

    public async Task Post()
    {        
        dynamic obj = await Request.Content.ReadAsAsync<JObject>();
        var y = obj.var1;
    }

上記の両方が Fiddler を使用して機能します。最初のオプションが機能しない場合は、コンテンツ タイプを に設定して、がコンテンツの逆シリアル化に使用されるapplication/jsonようにしてください。JsonMediaTypeFormatter

于 2012-10-29T20:09:56.757 に答える
7

これについてしばらく頭を悩ませ、さまざまなことを試した後、APIサーバーにいくつかのブレークポイントを配置することになり、キーと値のペアがリクエストに詰め込まれていることがわかりました。それらがどこにあるかを知った後、それらにアクセスするのは簡単でした. ただし、このメソッドが WebClient.UploadString で機能することしかわかりませんでした。ただし、それは十分に簡単に機能し、好きなだけパラメーターをロードして、サーバー側に非常に簡単にアクセスできます。.net 4.5 をターゲットにしていることに注意してください。

クライアント側

// Client request to POST the parameters and capture the response
public string webClientPostQuery(string user, string pass, string controller)
{
    string response = "";

    string parameters = "u=" + user + "&p=" + pass; // Add all parameters here.
    // POST parameters could also easily be passed as a string through the method.

    Uri uri = new Uri("http://localhost:50000/api/" + controller); 
    // This was written to work for many authorized controllers.

    using (WebClient wc = new WebClient())
    {
        try
        {
            wc.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
            response = wc.UploadString(uri, login);
        }
        catch (WebException myexp)
        { 
           // Do something with this exception.
           // I wrote a specific error handler that runs on the response elsewhere so,
           // I just swallow it, not best practice, but I didn't think of a better way
        }
    }

    return response;
}

サーバ側

// In the Controller method which handles the POST request, call this helper:
string someKeyValue = getFormKeyValue("someKey");
// This value can now be used anywhere in the Controller.
// Do note that it could be blank or whitespace.

// This method just gets the first value that matches the key.
// Most key's you are sending only have one value. This checks that assumption.
// More logic could be added to deal with multiple values easily enough.
public string getFormKeyValue(string key)
{
    string[] values;
    string value = "";
    try
    {
        values = HttpContext.Current.Request.Form.GetValues(key);
        if (values.Length >= 1)
            value = values[0];
    }
    catch (Exception exp) { /* do something with this */ }

    return value;
}

複数値の Request.Form キーと値のペアを処理する方法の詳細については、次を参照してください。

http://msdn.microsoft.com/en-us/library/6c3yckfw(v=vs.110).aspx

于 2014-05-29T21:25:48.623 に答える
2

クライアント コードとサーバー コードの両方を示す答えを見つけるために午前中ずっと検索し、最終的にそれを見つけました。

簡単な紹介 - UI は、標準ビューを実装する MVC 4.5 プロジェクトです。サーバー側は MVC 4.5 WebApi です。目的は、モデルを JSON として POST し、その後データベースを更新することでした。UI とバックエンドの両方をコーディングするのは私の責任でした。以下はコードです。これは私にとってはうまくいきました。

モデル

public class Team
{
    public int Ident { get; set; }
    public string Tricode { get; set; }
    public string TeamName { get; set; }
    public string DisplayName { get; set; }
    public string Division { get; set; }
    public string LogoPath { get; set; }
}

クライアント側 (UI コントローラー)

    private string UpdateTeam(Team team)
    {
        dynamic json = JsonConvert.SerializeObject(team);
        string uri = @"http://localhost/MyWebApi/api/PlayerChart/PostUpdateTeam";

        try
        {
            WebRequest request = WebRequest.Create(uri);
            request.Method = "POST";
            request.ContentType = "application/json; charset=utf-8";
            using (var streamWriter = new StreamWriter(request.GetRequestStream()))
            {
                streamWriter.Write(json);
                streamWriter.Flush();
                streamWriter.Close();
            }
            WebResponse response = (HttpWebResponse)request.GetResponse();
            using (var streamReader = new StreamReader(response.GetResponseStream()))
            {
                var result = streamReader.ReadToEnd();
            }
        }
        catch (Exception e)
        {
            msg = e.Message;
        }
    }

サーバー側 (WebApi コントローラー)

    [Route("api/PlayerChart/PostUpdateTeam")]
    [HttpPost]
    public string PostUpdateTeam(HttpRequestMessage context)
    {
        var contentResult = context.Content.ReadAsStringAsync();
        string result = contentResult.Result;
        Team team = JsonConvert.DeserializeObject<Team>(result);

        //(proceed and update database)
    }

WebApiConfig (ルート)

        config.Routes.MapHttpRoute(
            name: "PostUpdateTeam",
            routeTemplate: "api/PlayerChart/PostUpdateTeam/{context}",
            defaults: new { context = RouteParameter.Optional }
        );
于 2019-02-08T20:47:16.480 に答える
-5

次の方法を使用してみてください

[AcceptVerbs("POST")]
[ActionName("myActionName")]
public static void DoSomeStuff(var value)
{
    //first way
   var x = value;
}
于 2012-10-29T11:49:45.067 に答える