javascript - Mencoba membuat JQuery Post berkomunikasi dengan WCF, tetapi data JSON tidak diterima
Saya menggunakan kode JQuery\JavaScript berikut untuk berkomunikasi dengan layanan WCF 4 REST.
<script>
var serviceUrl = "http://services.xiine.com/Xiine/Live/AccountService/rest/json/Login";
var userInfo = {
"IsNotEncrypted":true,
"Password":null,
"UserName":null
};
var loginSuccess = function(data, textStatus, jqXHR){
console.log("yay");
};
var loginError = function(){
console.log("oh no");
};
$.post(serviceUrl , userInfo, loginSuccess);
$.post(serviceUrl , loginSuccess);
</script>
Saya mencoba untuk mengetahui mengapa layanan akan mengembalikan nilai salah dengan benar ketika saya tidak mengirimkan data pengguna:
$.post(serviceUrl , loginSuccess);
Berbeda dengan saat saya mengirim data pengguna, pada saat itu muncul kesalahan POST 400 (Permintaan Buruk).
$.post(serviceUrl , userInfo, loginSuccess);
Saya yakin ini ada hubungannya dengan bagaimana objek JSON, userInfo, dibangun atau diinterpretasikan, dan saya bisa memposting dump Fiddler 2 atau WireShark, jika itu akan membantu. Tinggal beri tahu saya...
Saya sebenarnya tidak memiliki akses untuk mengubah sisi WCF dari layanan, jadi semoga ada sesuatu yang bisa saya lakukan di pihak saya untuk membuat ini berhasil.
Terima kasih!
Sunting
Saya mendapatkan sedikit informasi lebih... Ternyata, masalahnya adalah server merespons dengan kesalahan berikut:
Server mengalami kesalahan saat memproses permintaan. Pesan pengecualian adalah 'Pesan masuk memiliki format pesan yang tidak terduga 'Raw'. Format pesan yang diharapkan untuk operasi ini adalah 'Xml', 'Json'. Hal ini bisa terjadi karena WebContentTypeMapper belum dikonfigurasi pada binding. Lihat dokumentasi WebContentTypeMapper untuk lebih jelasnya.' Lihat log server untuk informasi lebih lanjut. Jejak tumpukan pengecualian adalah:
di System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(Pesan pesan, Objek[] parameter) di System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(Pesan pesan, Objek[] parameter) di System.ServiceModel.Dispatcher.CompositeDispatchFormatter.DeserializeRequest(Pesan pesan, Objek[] parameter) di System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc) di System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) di System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) di System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) di System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
Jadi saya berpikir saya perlu mencari cara untuk membuat objek berjalan melintasi kabel sebagai objek JSON melalui metode JQuery.post().
Informasi lebih lanjut --- Lagi...
ok... Tidak ada app.config atau web.config, seperti itu.
Ini yang bisa saya dapatkan sejauh kontrak, kode, dan sebagainya.
[ServiceContract]
public interface IAccount
{
[OperationContract]
bool Login(UserInformation user);
}
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class AccountService : IAccount
{
public bool Login(UserInformation user)
{
//stuff...
}
}
[DataContract]
public class UserInformation
{
[DataMember(IsRequired = true)]
public string UserName;
[DataMember(IsRequired = true)]
public string Password;
[DataMember(IsRequired = true)]
public bool IsNotEncrypted;
}
public interface IUserInformation
{
UserInformation UserInformation { get; set; }
}
Jawaban #1
Jadi, saya menemukan jawaban untuk pertanyaan saya.
Seseorang mencoba menunjukkan arah yang benar kepada saya dengan menyebutkan metode JSON.stringify(), tetapi saya perlu sedikit usaha untuk mengimplementasikannya dengan benar.
Pada akhirnya, saya menggunakan WireShark untuk mengendus permintaan http, melihat apa yang sebenarnya dikirim dan diterima, dan mengamati bahwa tidak hanya saya perlu mengubah data menjadi string, tetapi saya juga perlu menentukan tipe kontennya.
Berikut adalah kode akhirnya.
// This is the URL that is used for the service.
var serviceUrl = "http://services.xiine.com/Xiine/Live/AccountService/rest/json/Login";
// This is the JSON object passed to the service
var userInfo = {
"UserName": null,
"Password": null,
"IsNotEncrypted": true
};
// $.ajax is the longhand ajax call in JQuery
$.ajax({
type: "POST",
url: serviceUrl,
contentType: "application/json; charset=utf-8",
// Stringify the userInfo to send a string representation of the JSON Object
data: JSON.stringify(userInfo),
dataType: "json",
success: function(msg) {
console.log(msg);
}});
Jawaban #2
di antarmuka untuk layanan Anda, Anda perlu memiliki atribut OperationalContract dan di dalam atribut itu, Anda perlu mengatur RequestFormat. Berikut adalah contoh seperti apa tampilannya.
[OperationContract, WebInvoke(UriTemplate = "/runGenericMethodJSON", Method = "POST",
RequestFormat = WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.WrappedRequest)]
