2010-02-02 2 views
3

Почему это WCF 3,5 методWCF + Json = неправильно сериализации

[ServiceContract] 
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class Json 
{ 
    [OperationContract] 
    [WebGet(ResponseFormat = WebMessageFormat.Json)] 
    public string Upper(string text) 
    { 
     return text.ToUpper(); 
    } 
} 

возвращается {"d":"TEXT"}?

Он должен возвращает {"TEXT"}

Я звоню с помощью JQuery.

$("#upper").click(function() { 
     $.ajax({ 
      type: "GET", 
      url: "/Json.svc/Upper?text="+$("#input1").val(), 
      success: function(data) { 
       $("#input1").val(data.d); 
      } 
     }); 
    }); 

ответ

8

Это функция безопасности, которая была добавлена ​​к сериализации JSON в .NET 3.5. Это контейнерный объект, поэтому вместо, скажем, results[0], вы просто скажете results.d[0]. Прочтите this article для получения дополнительной информации.

+0

Nice Brandon, но могу ли я удалить или отключить это? – Zote

+0

Не об этом я знаю. Но почему вы хотите отключить это? Это большой риск для безопасности, если вы отключите его. Как говорится в статье, сейчас стоит потратить усилия на «контейнерный объект». –

+0

Кроме того, '{'Text'}' недействителен JSON. В jQuery 1.4.x это вызовет проблемы, поэтому .d тоже хорошо по этой причине. –

0

Вы пробовали изменения BodyStyle свойства вашего [WebGet] Attribute так, чтобы ответы не обернуты?

+0

Да, но я получаю это исключение «Стиль тела« Обернутый »не поддерживается« WebScriptEnablingBehavior ». Измените стиль тела как« WrappedRequest ». или «Стиль тела« Bare »не поддерживается« WebScriptEnablingBehavior ». Измените стиль тела на« WrappedRequest ».» – Zote

+1

Если вы используете webScriptEnablingBehavior, то да, это может вызвать проблемы. Есть ли конкретная причина, по которой вы хотите, чтобы вместо webHttpBehavior? Также вы проверили это: http://www.west-wind.com/weblog/posts/324917.aspx – tomasr

+0

Нет особых причин. Я вчера как ваша ссылка, но я думаю, что мой web.config был неправильным, поэтому я получил еще один учебник по бингу. Это учебник работает нормально, единственная проблема заключается в этом d "свойстве". – Zote

0

Я предполагаю, что вы используете <enableWebScript/> в своей конфигурации поведения, замените его на <webHttp defaultOutgoingResponseFormat="Json"/>, и вы получите json без корня «d» и без реквизита «__type».

Однако, я проверил это только в 4.0

Я также не использовать какие-либо атрибуты в коде.

+0

Это не сработает, вам все равно придется иметь bodystyle = webmessagebodystyle.wrappedrequest, который включает в себя «d» и «___type». Если вы измените его на Bare, вы получите сообщение об ошибке, которое Bare не поддерживается для WebScriptEnablingBehavior. – Justin

+0

Я могу заверить вас, что он действительно работает, но я должен был уточнить, что я тестировал только в 4.0, и я не использую никаких атрибутов в коде. – JeremyWeir

Смежные вопросы