Попытка получить сообщение JQuery Post для связи с WCF, но данные JSON не принимаются - PullRequest
6 голосов
/ 06 июля 2011

Я использую следующий код JQuery \ JavaScript для связи со службой REST WCF 4.

<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>

Я пытаюсь установить, почему служба правильно возвращает ложное значение, когда я не передаю данные пользователя:

$.post(serviceUrl , loginSuccess);

В отличие от того, когда я передаю пользовательские данные, в этот момент выдается ошибка POST 400 (Bad Request).

$.post(serviceUrl , userInfo, loginSuccess);

Я уверен, что это связано с тем, как создается или интерпретируется объект JSON userInfo, и я могу опубликовать дампы Fiddler 2 или WireShark, если это поможет. Просто дай мне знать ...

На самом деле у меня нет доступа к изменению стороны службы WCF, так что, надеюсь, у меня есть кое-что, чтобы сделать эту работу.

Спасибо!

Редактировать

Я получил немного больше информации ... Судя по всему, проблема в том, что сервер отвечает следующей ошибкой:

Сервер обнаружил ошибку при обработке запроса. Сообщение об исключении: «Входящее сообщение> имеет неожиданный формат сообщения« Raw ». Ожидаемые форматы сообщений для операции: «Xml»,> «Json». Это может быть потому, что в привязке не настроен WebContentTypeMapper. См.> Документацию WebContentTypeMapper для получения более подробной информации. '. Смотрите журналы сервера для более подробной информации. Трассировка стека исключений:

в System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest (сообщение-сообщение, параметры Object []) в System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest (сообщение-сообщение, параметры Object []) в System.Formatisserter.Service.Service.Serserserver DeserializeRequest (сообщение сообщение, Object []) параметры на System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs (MessageRpc & RPC) в System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin (MessageRpc & RPC) в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5 (MessageRpc & rpc) в System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41 (MessageRpc & rpc) в System.ServiceModel.Dispatcher.MessageRpc.Process (логический isOperationContextSet)

Так что я думаю, мне нужно выяснить, как заставить объект проходить по проводам в виде объекта JSON с помощью метода JQuery.post ().

Дополнительная информация --- Снова ...

хорошо ... Нет app.config или web.config как такового.

Вот то, что я могу получить, что касается контрактов и кода, а что нет.

[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; }
}

Ответы [ 2 ]

7 голосов
/ 11 июля 2011

Итак, я нашел ответ на свой вопрос.

Кто-то попытался указать мне правильное направление, упомянув метод JSON.stringify (), но мне потребовалось немного усилий, чтобы получить егореализован правильно.

В конце концов, я использовал WireShark, чтобы выяснить http-запрос, посмотреть, что на самом деле отправлялось и получалось, и наблюдать, что мне нужно было не только скупить данные, но иукажите тип содержимого.

Вот окончательный код.

// 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);
        }});
0 голосов
/ 07 июля 2011

в интерфейсе для вашего сервиса, вам нужно иметь атрибут OperationalContract, и в этом атрибуте вам нужно установить RequestFormat. Вот пример того, как это может выглядеть.

[OperationContract, WebInvoke(UriTemplate = "/runGenericMethodJSON", Method = "POST",
        RequestFormat = WebMessageFormat.Json,
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.WrappedRequest)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...