Parameter posting selalu nol

197

Sejak memutakhirkan ke RC untuk WebAPI, saya mengalami masalah aneh saat memanggil POST di WebAPI saya. Saya bahkan sudah kembali ke versi dasar yang dihasilkan pada proyek baru. Begitu:

public void Post(string value)
{
}

dan menelepon dari Fiddler:

Header:
User-Agent: Fiddler
Host: localhost:60725
Content-Type: application/json
Content-Length: 29

Body:
{
    "value": "test"
}

Saat saya debug, string "nilai" tidak pernah ditugaskan. Itu selalu NULL. Adakah yang mengalami masalah ini?

(Saya pertama kali melihat masalah dengan jenis yang lebih kompleks)

Masalahnya tidak hanya terikat pada ASP.NET MVC 4, masalah yang sama terjadi untuk proyek ASP.NET MVC 3 baru setelah instalasi RC

tulang ianrath
sumber
Hanya untuk menambah masalah - ini tidak eksklusif untuk JSON, itu terjadi dengan XML juga.
ianrathbone
3
Saya telah menghadapi hal ini selama dua hari dan setelah membaca setiap artikel yang dapat saya temukan tentang hal itu, ternyata sesederhana memformat string JSON dengan benar di WebRequest: Data harus dimulai dan diakhiri dengan tanda kutip ganda dan jika Anda kemudian gunakan tanda kutip tunggal di seluruh data json Anda semuanya bermain bagus.
Gineer

Jawaban:

101

Karena Anda hanya memiliki satu parameter, Anda dapat mencoba mendekorasi dengan [FromBody]atribut, atau mengubah metode untuk menerima DTO dengan nilai sebagai properti, seperti yang saya sarankan di sini: MVC4 RC WebApi mengikat parameter

UPDATE: Situs resmi ASP.NET diperbarui hari ini dengan penjelasan yang sangat baik: https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part- 1

Singkatnya, saat mengirim satu tipe sederhana dalam isi, kirimkan nilai yang diawali dengan tanda sama dengan (=), mis. Isi:

=test

Jim Harte
sumber
9
Saya memang membuat [FromBody] berputar tetapi tidak ada perubahan
ianrathbone
11
Berikan nilai saja (mis. Bukan sebagai objek JSON) dan seharusnya berfungsi, menurut blogs.msdn.com/b/jmstall/archive/2012/04/16/…
Jim Harte
8
Tambahkan =di depan tidak pernah bekerja untuk saya, sampai saya mengikuti saran Jim dalam komentarnya (bukan sebagai objek JSON) dan berhasil. Ini kuncinya! Saya benar-benar tidak suka pilih-pilih WebAPI.
gitsitgo
16
Ini sangat bodoh dan menjengkelkan sehingga saya tidak tahu apakah harus memperbaiki atau menurunkan jawaban yang membantu saya memecahkan masalah saya ... Mengapa harus dalam format ini? (Maaf atas sikapnya, hanya membuang terlalu banyak waktu untuk ini, dan itu tidak masuk akal ... :(). Anda harus benar-benar menambahkan dukungan untuk format yang diharapkan orang untuk menerima.
gdoron mendukung Monica
6
Terima kasih! Bagaimana mungkin kita tahu bahwa kita harus menghapus nama parameter saat mengirim hanya satu parameter? Otak burung mana yang muncul dengan gagasan ini?
Jenny O'Reilly
104

Saya telah menggaruk kepala saya hari ini.

Solusi saya adalah mengubah [FromBody]ke aHttpRequestMessage , pada dasarnya bergerak naik tumpukan HTTP.

Dalam kasus saya, saya mengirim data melalui kawat yang zip json yang kemudian base64. Semua ini dari aplikasi android.

Tanda tangan asli dari titik akhir web saya terlihat seperti ini (menggunakan [FromBody]):

Titik akhir asli saya

Perbaikan saya untuk masalah ini adalah kembali menggunakan HttpRequestMessagetanda tangan titik akhir saya.

masukkan deskripsi gambar di sini

Anda kemudian bisa mendapatkan akses ke data posting menggunakan baris kode ini:

masukkan deskripsi gambar di sini

Ini berfungsi dan memungkinkan Anda akses ke data kiriman mentah yang tidak tersentuh. Anda tidak perlu dipusingkan dengan fiddler menempatkan tanda = di awal string Anda atau mengubah tipe konten.

Sebagai tambahan, saya pertama kali mencoba mengikuti salah satu jawaban di atas yang mengubah tipe konten menjadi: "Tipe-Konten: application / x-www-form-urlencoded". Untuk data mentah, ini adalah saran buruk karena menghapus + karakter.

Jadi string base64 yang dimulai seperti ini: "MQ0AAB + LCAAAAAA" berakhir seperti ini "MQ0AAB LCAAAAAA"! Bukan apa yang kamu inginkan.

Manfaat lain menggunakan HttpRequestMessageadalah bahwa Anda mendapatkan akses ke semua header http dari dalam titik akhir Anda.

Airdrop Samudera
sumber
6
Solusi luar biasa ... butuh waktu 9 jam untuk menemukan ini, mengurutkan masalah saya setelah saya menghapus nilai string [FromBody] dan menggantinya dengan HttpRequestMessage
Kev
1
Bekerja seperti pesona! tetapi tidak adakah cara untuk menggunakan tipe parameter aktual dari objek tertentu? mis., parameter Ketik jenis untuk metode api web?
Ron Nuni
7
Hanya catatan tambahan, Anda TIDAK PERLU HttpRequestMessage requestdalam metode tanda tangan, karena Anda sudah memiliki ini. Dalam tubuh metode itu dapat diakses pada Requestobjek. misalnyaRequest.Content.ReadAsStringAsync().Result;
Morvael
Biasanya masalah ini adalah karena objek JSON Anda salah. Saya telah menemukan ini selalu karena dalam konstruktor memiliki tipe yang tidak valid dan Json tidak tahu bagaimana mengubahnya 'Seperti Bimbingan ke string. Jadi, tambahkan konverter melalui pengaturan atau tambahkan konstruktor kosong dan Anda tidak perlu kembali ke kode lama seperti ini.
Nick Turner
Cara termudah adalah dengan mengganti objek ke string dan kemudian mencoba dan mengubahnya dan Anda akan melihat kesalahan JSON. Periksa header Anda juga.
Nick Turner
71

Saya baru saja mengalami ini menggunakan Fiddler. Masalahnya adalah bahwa saya belum menentukan Content-Type.

Coba sertakan tajuk untuk Content-Typepermintaan POST Anda.

Content-Type: application/x-www-form-urlencoded

Atau, sesuai komentar di bawah ini, Anda mungkin perlu menyertakan header JSON

Content-Type: application/json
Kirk Broadhurst
sumber
11
Saya memiliki masalah yang sama, kecuali bahwa saya perlu mengatur Tipe-Konten: application / json
dvallejo
2
Seperti yang ditentukan dalam posting - Saya sudah menambahkan Tipe-Konten: application / json
ianrathbone
2
application / x-www-form-urlencoded tidak berfungsi untuk saya, Content-Type: application / json tidak.
liang
1
Terlepas dari tipe kontennya, jika Anda hanya memiliki satu parameter, Anda harus mengirim hanya nilainya tanpa nama parameter di badan permintaan. Jadi id = 13 tidak akan berfungsi. Anda perlu mengirim 13 saja. Lihat jawaban Jim.
Jenny O'Reilly
Saya harus menggunakan contentType: "application/x-www-form-urlencoded; charset=UTF-8", untuk contoh lengkap lihat Lengkap Cient dan Server
RyBolt
57

Saya juga mengalami masalah ini, dan inilah cara saya memecahkan masalah saya

kode webapi:

public void Post([FromBody] dynamic data)
{
    string value = data.value;
    /* do stuff */
}

kode klien:

$.post( "webapi/address", { value: "some value" } );
George
sumber
1
Ini berfungsi jika klien mengirim JSON. Jika saya mengirim nilai sederhana seperti string some value, maka itu dataadalah nol.
brianestey
mudah, ubah kode klien Anda untuk mengirim kembali objek js.
George
Cara hebat dan bersih untuk mendapatkan data dari JSON
Wouter Vanherck
Jika Anda mengirim json, maka var json = JsonConvert.SerializeObject (data);
dvallejo
41

Saya menggunakan Postmandan saya melakukan kesalahan yang sama .. melewati objek valuesebagai json, bukan string

{
    "value": "test"
}

Jelas yang di atas salah ketika parameter api bertipe string.

Jadi, cukup masukkan string dengan tanda kutip ganda di badan api:

"test"
JerryGoyal
sumber
2
Ini adalah masalah saya, dan kemungkinan solusi nyata untuk pertanyaan itu. String JSON-encoded memiliki tanda kutip
Kyle W
1
Saya juga mengalami masalah ini pada Postman. Ternyata saya salah memilih "form-data" daripada "raw" untuk Body ketika Content-Type diatur menjadi application / json. Anda dapat merujuk pada tangkapan layar zzyykk123456 di Issues of aspnet Github: github.com/aspnet/Home/issues/2202
Chun Lin
Ini berhasil untuk saya. Menggunakan Swagger (swashbuckle) saya harus mengatur Tipe Konten: application / json dan menggunakan tanda kutip ganda.
John Henckel
1
Persis Masalah saya Tapi saya harus mencatat bahwa dalam permintaan Ajax Anda harus melakukan 'data: JSON.stringify ("YourString")'
Amir Hossein Ahmadi
1
@AmirHosseinAhmadi Saya baru saja menemukan ini di ajax dan melihat bahwa sebenarnya menggunakan JSON.stringifyitu menyebabkan saya [frombody]menjadi null. Setelah menyetel bidang data ke nilai string (yaitu string json) itu berhasil.
Nexaspx
19

Coba buat kelas untuk dijadikan model data, lalu kirim objek JSON dengan properti yang cocok dengan properti kelas model data Anda. (Catatan: Saya telah menguji ini dan berfungsi dengan MVC 4 RC 2012 terbaru yang baru saja saya unduh hari ini).

public HttpResponseMessage Post(ValueModel model)
{
    return Request.CreateResponse<string>(HttpStatusCode.OK, "Value Recieved: " + model.Value);
}

public class ValueModel
{
    public string Value { get; set; }
}

Objek JSON di bawah ini dikirim dalam tubuh HTTP-POST, tipe konten adalah aplikasi / json

{ "value": "In MVC4 Beta you could map to simple types like string, but testing with RC 2012 I have only been able to map to DataModels and only JSON (application/json) and url-encoded (application/x-www-form-urlencoded body formats have worked. XML is not working for some reason" }

Saya percaya alasan mengapa Anda harus membuat kelas model data adalah karena nilai-nilai sederhana diasumsikan dari parameter url, dan nilai kompleks tunggal diasumsikan berasal dari tubuh. Mereka memang memiliki atribut [FromBody]dan [FromUrl], tetapi menggunakan[FromBody] string value masih tidak bekerja untuk saya. Sepertinya mereka masih mengerjakan banyak bug jadi saya yakin ini akan berubah di masa depan.

Sunting: Punya XML untuk bekerja di dalam tubuh. Serializer XML default diubah menjadi DataContractSerializer alih-alih XmlSerializer. Menempatkan baris berikut di file Global.asax saya memperbaiki masalah ini ( referensi )

GlobalConfiguration.Configuration.Formatters.XmlFormatter.UseXmlSerializer = true;
Despertar
sumber
ini bekerja untuk saya dengan request.ContentType = "application / json; charset = UTF-8";
Arvind Krmar
15

Setelah beberapa kali mencoba, saya pikir perilaku default sudah benar dan tidak ada yang perlu diretas.

Satu-satunya trik adalah: jika argumen metode posting Anda stringseperti di bawah ini, Anda harus mengirim string polos dengan tanda kutip ganda di tubuh (ketika menggunakan ajax atau tukang pos), misalnya,

//send "{\"a\":1}" in body to me, note the outer double quotes
[HttpPost("api1")]
public String PostMethod1([FromBody]string value)
{
    return "received " + value; //  "received {\"a\":1}"
}

Kalau tidak, jika Anda mengirim string json di badan pos tanpa tanda kutip luar ganda dan lolos dalam tanda kutip, maka itu harus dapat diuraikan ke kelas model (tipe argumen), misalnya,{"a":1, "b":2}

public class MyPoco{
    public int a;
    public int b;
}

//send {"a":1, "b":2} in body to me
[HttpPost("api2")]
public String PostMethod2([FromBody]MyPoco value)
{
    return "received " + value.ToString();  //"received your_namespace+MyPoco"
}
Leon
sumber
11

Saya sedang mencari solusi untuk masalah ini selama beberapa menit sekarang, jadi saya akan membagikan solusi saya.

Jika Anda memposting model, model Anda harus memiliki konstruktor kosong / default, jika tidak, model tersebut tidak dapat dibuat. Hati-hati saat melakukan refactoring. ;)

chrjs
sumber
Refactoring adalah yang menggigit saya di sini, terima kasih atas tipnya!
Alan
10

Ini bekerja untuk saya:

  1. Buat kelas C # DTO, dengan properti untuk setiap atribut yang ingin Anda lewati dari jQuery / Ajax

    public class EntityData
    {
        public string Attr1 { get; set; }
        public string Attr2 { get; set; }
    }
  2. Tentukan metode api web:

    [HttpPost()]
    public JObject AddNewEntity([FromBody] EntityData entityData)
    {
  3. Panggil api web seperti itu:

    var entityData = {
        "attr1": "value1",
        "attr2": "value2"
    };
    
    $.ajax({
        type: "POST",
        url: "/api/YOURCONTROLLER/addnewentity",
        async: true,
        cache: false,
        data: JSON.stringify(entityData),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function (response) {
            ...
        }
    });
BigMan73
sumber
Terima kasih telah memposting ini, saya mencoba banyak sampel tetapi ini berhasil untuk saya!
Satbir
10

Bagi mereka yang memiliki masalah yang sama dengan Swagger atau Postman seperti yang saya lakukan, jika Anda melewatkan atribut sederhana sebagai string dalam posting, bahkan dengan "ContentType" yang ditentukan, Anda masih akan mendapatkan nilai nol.

Lulus saja:

Nilai Saya

Akan masuk controller sebagai null.

Tetapi jika Anda lulus:

"Nilai Saya"

Nilainya akan menjadi benar.

Kutipan membuat perbedaan di sini. Tentu saja, ini hanya untuk Swagger dan Postman. Misalnya, dalam aplikasi Frontend menggunakan Angular ini harus diselesaikan oleh kerangka kerja secara otomatis.

dvc.junior
sumber
6

Saya memiliki masalah yang sama dan menemukan bahwa ketika mengubah Tipe Konten menjadi "application / json" tidak memperbaiki masalah. Namun "application / json; charset = utf-8" berfungsi.

byobgyn
sumber
Yup, API Web tidak akan deserialize tanpa charset = utf-8. blog.codenamed.nl/2015/05/05/...
Sam Rueby
4

Saya memiliki masalah serupa di mana objek permintaan untuk metode API Web saya selalu nol. Saya perhatikan bahwa karena nama tindakan pengontrol diawali dengan "Get", Web API memperlakukan ini sebagai GET HTTP daripada POST. Setelah mengganti nama tindakan pengontrol, sekarang berfungsi sebagaimana dimaksud.

Richard Pursehouse
sumber
3

Dengan Angular, saya dapat meneruskan data dalam format ini:

 data: '=' + JSON.stringify({ u: $scope.usrname1, p: $scope.pwd1 }),
 headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8' }

Dan di Pengontrol API Web:

    [HttpPost]
    public Hashtable Post([FromBody]string jsonString)
    {
        IDictionary<string, string> data = JsonConvert.DeserializeObject<IDictionary<string, string>>(jsonString);
        string username = data["u"];
        string pwd = data["p"];
   ......

Atau, saya juga bisa memposting data JSON seperti ini:

    data: { PaintingId: 1, Title: "Animal show", Price: 10.50 } 

Dan, di controller, terima tipe kelas seperti ini:

    [HttpPost]
    public string POST(Models.PostModel pm)
    {

     ....
    }

Apa pun cara kerjanya, jika Anda memiliki kelas publik yang mapan di API kemudian memposting JSON, jika tidak posting '=' + JSON.stringify ({..: ..., ..: ...})

Yogi
sumber
3

Dalam kasus saya masalahnya adalah bahwa parameternya adalah string dan bukan objek, saya mengubah parameter menjadi JObject dari Newsoft.Json dan berfungsi.

syb
sumber
2

Menambahkan baris

        ValueProviderFactories.Factories.Add(new JsonValueProviderFactory());

sampai akhir fungsi protected void Application_Start()di Global.asax.cs memperbaiki masalah serupa untuk saya di ASP.NET MVC3.

Sergey Kudriavtsev
sumber
Terima kasih atas bantuannya tetapi sayangnya itu tidak membantu. Saya akan menjaga saluran untuk sementara waktu karena mungkin membantu!
ianrathbone
Hanya untuk menambahkan masalah yang sama terjadi ketika saya memposting XML
ianrathbone
2

Jika Anda menggunakan DataContractSerializer untuk Xter Formatter atau JSON Formatter, Anda harus menyingkirkannya. Saya memiliki ini di file WebApiConfig saya:

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

     var jsonFormatter = config.Formatters.OfType<JsonMediaTypeFormatter>().First();
     jsonFormatter.UseDataContractJsonSerializer = true;
}

Cukup saya komentari jsonFormatter.UseDataContractJsonSerializer = true;dan parameter input saya bukan nol lagi. Terima kasih kepada 'Despertar' karena memberi saya petunjuk.

Amir Chatrbahr
sumber
2

Jika Anda yakin tentang JSON yang Anda kirim maka Anda harus melacak API Anda dengan cermat:

  1. Instal Microsoft.AspNet.WebApi.Tracingpaket
  2. Tambahkan config.EnableSystemDiagnosticsTracing();metode WebApiConfigclass inside Register.

Sekarang lihat output Debug dan Anda mungkin akan menemukan tidak valid ModelState entri log yang .

Jika ModelStatetidak valid Anda dapat menemukan penyebab sebenarnya di Errors:

Tidak ada yang bisa menebak pengecualian seperti ini:

Could not load file or assembly 'Newtonsoft.Json, Version=9.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
Mohsen Afshin
sumber
Anda menyelamatkan hidup saya. Mendapatkan null sebagai model dan setelah menginstal paket, menemukan bahwa JSON saya tidak dalam format yang benar.
Khizar Iqbal
2

Saya memiliki masalah yang sama untuk mendapatkan null sebagai parameter, tetapi itu terkait dengan objek besar. Ternyata masalah itu terkait dengan panjang max IIS. Ini dapat dikonfigurasi di web.config.

  <system.web>
    <httpRuntime targetFramework="4.7" maxRequestLength="1073741824" />
  </system.web>

Saya bertanya-tanya mengapa Web API menekan kesalahan dan mengirim objek nol ke API saya. Saya menemukan kesalahan menggunakan Microsoft.AspNet.WebApi.Tracing.

mohghaderi
sumber
2

JSON.stringify (...) menyelesaikan masalah saya

ragnarswanson
sumber
1

Saya tahu ini bukan jawaban untuk pertanyaan ini, tetapi saya menemukan jawabannya ketika mencari solusi untuk masalah saya.

Dalam kasus saya, tipe kompleks tidak terikat tetapi saya tidak melakukan POST, saya melakukan GET dengan parameter querystring. Solusinya adalah menambahkan [FromUri] ke arg:

public class MyController : ApiController
{
    public IEnumerable<MyModel> Get([FromUri] MyComplexType input)
    {
        // input is not null as long as [FromUri] is present in the method arg
    }
}
danludwig
sumber
Itu karena isi permintaan diabaikan (dan terkadang menyebabkan kesalahan) saat menggunakan GET. Alasan kerjanya sekarang adalah b / c Anda sekarang melewati params pada string kueri, dan tubuh Anda kosong seperti seharusnya pada GET
RyBolt
1

Saya memiliki masalah yang sama di Fiddler. Saya sudah memiliki Content-Type: application/json; charset=utf-8atau Content-Type: application/jsondi header permintaan.

Permintaan tubuh saya juga string biasa, dan di Fiddler saya telah menulis: {'controller':'ctrl'}. Ini membuat parameter string dalam metode POST saya menjadi null.

Perbaiki : ingat untuk menggunakan tanda kutip, dengan demikian menunjukkan string. Yaitu, saya memperbaikinya dengan menulis "{'controller':'ctrl'}". (Catatan: saat menulis JSON, pastikan untuk menggunakan tanda kutip atau luput dari tanda kutip seperti ini "{\"controller\":\"ctrl\"}":).

gosr
sumber
Saya harus melakukan hal yang sama di Postman. Tapi saya tidak perlu melakukan ini ketika saya menelepon layanan Spring. Sepertinya ada masalah di sisi .Net.
Malcolm McRoberts
1

Cara paling sederhana yang saya temukan untuk berurusan dengan objek JSON sederhana yang saya berikan ke MVC 6 adalah mendapatkan jenis parameter posting seperti NewtonSoft jObject:

public ActionResult Test2([FromBody] jObject str)
{
        return Json(new { message = "Test1 Returned: "+ str }); ;
}
Pini Cheyni
sumber
Test ( [FromBody] object body, [FromHeader(Name="Content-Type")] string bodyMediaType) dapat bekerja lebih baik karena memeriksa bodyMediaType == "application.json"sebelum casting body ke JObject memberikan kesempatan untuk alternatif.
VladH
1

Solusi terbaik bagi saya adalah HTTP penuh seperti di bawah ini:

[Route("api/open")]
[HttpPost]
public async Task<string> open(HttpRequestMessage request)
{
    var json = await request.Content.ReadAsStringAsync();
    JavaScriptSerializer jss = new JavaScriptSerializer();            
    WS_OpenSession param = jss.Deserialize<WS_OpenSession>(json);
    return param.sessionid;
}

dan kemudian deserializing string ke objek yang Anda harapkan di post body. Bagi saya, WS_OpenSession adalah kelas yang berisi sessionid, pengguna, dan kunci.

Anda dapat dari sana menggunakan objek param dan mengakses propertinya.

Sangat sangat efektif.

Saya memang mengatakan bersumber dari url ini:

http://bizcoder.com/posting-raw-json-to-web-api

albertdadze
sumber
1

Untuk tipe yang kompleks, API Web mencoba membaca nilai dari badan pesan, menggunakan formatter tipe media.

Periksa apakah Anda memiliki [Serializable]atribut apa pun yang menghiasi kelas model Anda.

Hapus atribut untuk melihat apakah itu berfungsi. Ini berhasil untuk saya.

jaiveeru
sumber
1

Saya sedikit terlambat ke pesta, tetapi siapa pun yang menemukan nilai NULL yang lulus saat menggunakan pengontrol cukup menambahkan "=" ke bagian depan permintaan POST Anda.

Kontroler juga memberikan nilai NULL ketika saya menggunakan aplikasi / json Content-Type. Perhatikan Konten-Jenis "application / x-www-form-urlencoded" di bawah ini. Namun tipe pengembalian dari API adalah "application / json".

 public static string HttpPostRequest(string url, Dictionary<string, string> postParameters)
    {
        string postData = "=";

        foreach (string key in postParameters.Keys)
        {
            postData += HttpUtility.UrlEncode(key) + "="
                  + HttpUtility.UrlEncode(postParameters[key]) + ",";
        }

        HttpWebRequest myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
        myHttpWebRequest.Method = "POST";

        byte[] data = System.Text.Encoding.ASCII.GetBytes(postData);

        myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
        myHttpWebRequest.ContentLength = data.Length;

        Stream requestStream = myHttpWebRequest.GetRequestStream();
        requestStream.Write(data, 0, data.Length);
        requestStream.Close();

        HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();

        Stream responseStream = myHttpWebResponse.GetResponseStream();

        StreamReader myStreamReader = new StreamReader(responseStream, System.Text.Encoding.Default);

        string pageContent = myStreamReader.ReadToEnd();

        myStreamReader.Close();
        responseStream.Close();

        myHttpWebResponse.Close();

        return pageContent;
    }
JTStuedle
sumber
1

tidak masalah apa jenis nilai yang ingin Anda posting, cukup sertakan dalam tanda kutip, untuk mendapatkannya sebagai string. Bukan untuk tipe yang kompleks.

javascript:

    var myData = null, url = 'api/' + 'Named/' + 'NamedMethod';

    myData = 7;

    $http.post(url, "'" + myData + "'")
         .then(function (response) { console.log(response.data); });

    myData = "some sentence";

    $http.post(url, "'" + myData + "'")
         .then(function (response) { console.log(response.data); });

    myData = { name: 'person name', age: 21 };

    $http.post(url, "'" + JSON.stringify(myData) + "'")
         .then(function (response) { console.log(response.data); });

    $http.post(url, "'" + angular.toJson(myData) + "'")
         .then(function (response) { console.log(response.data); });

c #:

    public class NamedController : ApiController
    {
        [HttpPost]
        public int NamedMethod([FromBody] string value)
        {
            return value == null ? 1 : 0;
        }
    }
Dimitry Opochitsky
sumber
1

Jika Anda menempatkan anotasi [FromBody] dan Anda memiliki objek Dto sebagai parameter untuk metode Anda dan masih tidak bisa mendapatkan data melalui, mulai mencari ke properti dan bidang DTO Anda.

Saya memiliki masalah yang sama, di mana DTO saya menjadi nol. Saya menemukan alasannya adalah bahwa salah satu properti menunjuk ke sebuah objek yang tidak dapat diserialisasi :( yang menyebabkan media-formatter gagal mem-parsing data. Dengan demikian objek itu selalu nol. Semoga ini membantu orang lain juga

Memiliki AlTaiar
sumber
1

Periksa kembali tipe data Anda. Pengikat model dotnet tidak akan mengkonversi float ke integer (dan saya mengasumsikan konsep terkait lainnya). Ini akan menyebabkan seluruh model ditolak.

Jika Anda memiliki json seperti ini:

{
    "shoeSize": 10.5
}

tetapi model c # Anda terlihat seperti ini:

class Shoe{
    public int shoeSize;
}

pengikat model akan menolak model dan Anda akan mendapatkan nol.

TwitchBronBron
sumber
1

Saya sangat terlambat dalam hal ini tetapi mengalami masalah yang serupa dan setelah seharian melalui banyak jawaban di sini dan mendapatkan latar belakang, saya telah menemukan solusi termudah / ringan untuk mengembalikan satu atau lebih parameter ke Web API 2 Action. berikut:

Ini mengasumsikan bahwa Anda tahu cara menyiapkan pengontrol / tindakan Web API dengan perutean yang benar, jika tidak merujuk ke: https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with -aspnet-web-api / tutorial-web-api-pertama Anda .

Pertama Aksi Pengendali, solusi ini juga memerlukan pustaka Newtonsoft.Json.

[HttpPost]
public string PostProcessData([FromBody]string parameters) {
    if (!String.IsNullOrEmpty(parameters)) {
        JObject json = JObject.Parse(parameters);

        // Code logic below
        // Can access params via json["paramName"].ToString();
    }
    return "";
}

Sisi Klien menggunakan jQuery

var dataToSend = JSON.stringify({ param1: "value1", param2: "value2"...});
$.post('/Web_API_URI', { '': dataToSend }).done(function (data) {
     console.debug(data); // returned data from Web API
 });

Masalah utama yang saya temukan adalah memastikan Anda hanya mengirim satu parameter keseluruhan kembali ke Web API dan memastikan tidak memiliki nama hanya nilai, { '': dataToSend }jika tidak, nilai Anda akan nol di sisi server.

Dengan ini, Anda dapat mengirim satu atau banyak parameter ke API Web dalam struktur JSON dan Anda tidak perlu mendeklarasikan sisi server objek tambahan untuk menangani data yang kompleks. JObject juga memungkinkan Anda untuk beralih secara dinamis atas semua parameter yang diteruskan sehingga memungkinkan skalabilitas yang lebih mudah jika parameter Anda berubah seiring waktu. Semoga itu membantu seseorang yang sedang berjuang seperti saya.

Nathan
sumber
0

Benar melewati parameter tunggal dalam tubuh ke WebAPI bekerja kode ini $.post(url, { '': productId }

Dan menangkapnya dalam aksi [HttpPost] public ShoppingCartAddRemoveViewModel Delete([FromBody]string value)

Kuncinya adalah menggunakan kata ajaib 'nilai'. Mungkin juga int, atau tipe primitif. Tidak masalah apapun jenis konten atau koreksi tajuk Mess adalah bahwa kode ini tidak berfungsi dalam tindakan posting mvc.

Lapenkov Vladimir
sumber