Отправка почтового запроса в RESTful WCF с помощью json - PullRequest
7 голосов
/ 16 декабря 2011

Я перепробовал каждую комбинацию, чтобы отправить запрос на отправку запроса POST в RESTful WCF из jQuery.

Может кто-то подражать и заставить его работать. Код здесь: http://pastebin.com/Ua97919C

Я работаю с WCF за последние 2 года, но каждый раз, когда я отправляю запрос POST, это заставляет меня сильно сопротивляться.

Я изо всех сил пытаюсь заставить это работать за прошлые 4 дня и прошел по крайней мере 35-40 должностей.

В конечном итоге этот запрос будет отправлен с iPhone на WCF.

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

System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(Message message, Object[] parameters)
   at System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(Message message, Object[] parameters)
   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
   at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

Ответы [ 2 ]

4 голосов
/ 16 декабря 2011

Добавьте файл Global.ascx в ваше решение и замените код следующим

protected void Application_BeginRequest(object sender, EventArgs e)
{
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
    if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
    {
        HttpContext.Current.Response.AddHeader("Cache-Control", "no-cache");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
        HttpContext.Current.Response.End();
    }
}

еще одна вещь, chnage dataType:'text'

$.ajax({
    type: "POST",
    url: "http://localhost:4638/Edulink.svc/SaveUserData",                        
    dataType: "text",
    contentType: "application/json",
    data:'{"EmailID":"praveen", "LevelID": 1}',         
    success:function(data, status) {             
        console.log(data); //gives 1                
    },
    error:function(request, status, error) {
        alert("o0ops");           
    }
});
2 голосов
/ 16 декабря 2011

Проблема в типе тела операции.Вы объявили его как

[WebInvoke(
        Method = "POST",
        ResponseFormat = WebMessageFormat.Json,
        RequestFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.WrappedRequest,
        UriTemplate = "/SaveUserData")]
string SaveUserData(UserInfo userInfo);

, что означает, что запрос должен быть обернут в объекте с элементом для имени объекта.Если вы отправите этот запрос ниже, он должен работать.

$.ajax({
    type: "POST",
    contentType: "application/json; charset=utf-8",
    url: url,
    data: '{"userInfo":{"EmailID":"praveen", "LevelID": 1}}',
    dataType: "json",
    processData: false,
    success: function (data, textStatus, jqXHR) {
        debugger;
    },
    error: function (jqXHR, textStatus, errorThrown) {
        debugger;
    }
});

Другой альтернативой является изменение свойства операции BodyStyle на Bare, в этом случае ваш исходный запрос был верным.

...