Передача сложных объектов в службу отдыха WCF - PullRequest
11 голосов
/ 14 января 2010

У меня есть контракт операции, который принимает сложный объект, и я вызываю операцию через jQuery. Как передать объект сложного типа, как это с помощью jQuery. Ниже подпись операции:

public Resolution CreateNewResolution(Resolution NewResolution);

Мне нужно передать объект Resolution на клиенте, но я не знаю, как сделать что-то вроде использования jQuery. Любая помощь?

Спасибо

Ответы [ 2 ]

22 голосов
/ 14 января 2010

См. пост Денни для начала, хотя я не согласен с его использованием GET и передачей JSON в строку запроса для сложных параметров. Это кажется действительно неправильным.


Параметр, который вы используете для data, представляет собой json-представление любого типа вашего разрешения. Например, предположим, что тип и операция определены на стороне сервера следующим образом:

[DataContract( Namespace = "urn:brandon.michael.hunter/ws/2010/01", 
               Name = "Resolution" )]
public class Resolution
{
    [DataMember( IsRequired = true, Name = "Name" )]
    public string Name     { get; set; } 

    [DataMember( IsRequired = true, Name = "Rank" )]
    public int Rank { get; set; }

    [DataMember( IsRequired = true, Name = "SerialNumber" )]
    public int SerialNumber { get; set; } 

    [DataMember( IsRequired = false, Name = "Id" )]
    public int Id { get; set; } 
}

[OperationContract]
[WebInvoke(Method = "PUT",
           RequestFormat=WebMessageFormat.Json,
           ResponseFormat = WebMessageFormat.Json,
           UriTemplate = "new")]
public Resolution CreateNewResolution(Resolution r)
{
    // your logic here
    r.Id = System.Guid.NewGuid();
    return r;
}

Тогда в Javascript код, который вы используете, может выглядеть так:

var resolution = {r: { Name : "Fred", Rank : 2,  SerialNumber : 17268 }};

// convert object to JSON string  (See http://jollytoad.googlepages.com/json.js)
var objectAsJson = $.toJSON(resolution);
// result is a string:  '{"Name":"Fred","Rank":"2","SerialNumber":"17268"}'

$.ajax({
  type        : "PUT",              // must match Method in WebInvoke
  contentType : "application/json",
  url         : "Service.svc/new",  // must match UriTemplate in WebInvoke
  data        : objectAsJson, 
  dataFilter  : function (data, type) {
      // convert from "\/Date(nnnn)\/" to "new Date(nnnn)"
      return data.replace(/"\\\/(Date\([0-9-]+\))\\\/"/gi, 'new $1');
  },
  processData : false,              // do not convert outbound data to string (already done)
  success     : function(msg){ ... },
  error       : function(xhr, textStatus, errorThrown){ ... } 
 });

Примечания:

  • Вам нужно иметь имя переменной (r), чтобы быть первым объектом в JSON, который передается, по крайней мере с WCF 4. Когда я использовал предыдущий пример, он не работал, пока я не вставил в имя переменной в начале.
  • Для передачи сложных объектов в JSON используйте PUT или POST в качестве типа (HTTP-метода) запроса
  • вам нужно преобразовать сложный объект в строку JSON. Есть хороший, крошечный плагин jquery для этого . Денни предоставляет свою собственную реализацию.
  • Я обнаружил, что если я использую processData=true, то результирующая строка, отправляемая службе, будет в формате строки запроса, а не в формате JSON. Не то, что я хочу для прохождения сложных объектов. Таким образом, я установил это в ложь. Использование true подходит для простых запросов не в формате JSON, когда вы выполняете WebGet, а все параметры находятся в строке запроса.
  • dataFilter обеспечивает правильную десериализацию объектов DateTime
  • параметр msg, переданный обратному вызову success, содержит возвращенный json.
  • Возможно, вы захотите использовать средство перезаписи URL, чтобы скрыть этот тег .svc в URL-адресе запроса
  • в этом случае служба WCF использует поведение webHttp, а не enableWebScript. Последний динамически генерирует прокси Javascript для вызова службы, но то, как вы задали вопрос, создает впечатление, что вы этого не хотите.

0 голосов
/ 31 октября 2011

Посетите блог Гила Финка, посвященный объединению служб данных WCF, JSONP и jQuery

http://blogs.microsoft.co.il/blogs/gilf/archive/2011/04/24/combining-wcf-data-services-jsonp-and-jquery.aspx

Во время сеанса Майка Фласко в MIX11 он показал, как создать службу данных WCF с поддержкой JSONP с атрибутом JSONPSupportBehavior, доступным для загрузки из галереи кода MSDN (и предполагается быть частью пространства имен Microsoft.Data.Services.Extensions). В этом посте я покажу простой пример использования атрибута и jQuery для выполнения междоменного вызова JSONP для службы данных WCF.

Настройка среды

Сначала я начал с создания двух разных веб-приложений ASP.NET. Первое приложение включает в себя страницу вызова, а второе - Службу данных WCF. Затем я создал во втором веб-приложении модель Entity Framework и службу данных WCF из этой модели. Я также добавил класс JSONPSupportBehavior.cs, который существует в ссылке , предоставленной ранее. Класс включает в себя реализацию JSONPSupportBehavior, которая реализует интерфейс WCF IDispatchMessageInspector. Также он включает JSONPSupportBehaviorAttribute, который я использую в своем коде. Код прост и выглядит так:

[JSONPSupportBehavior] 
public class SchoolDataService : DataService<SchoolEntities>
{
  // This method is called only once to initialize service-wide policies.
  public static void InitializeService(DataServiceConfiguration config)
  {      
    config.SetEntitySetAccessRule("*", EntitySetRights.AllRead);      
    config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V2;
  }
}

Выполнение вызова JSONP

Во втором веб-приложении я создал веб-форму, которая будет содержать пример вызова JSONP. Вот код, который делает звонок:

<!DOCTYPE html>
<html>
<head runat="server">
    <title>JSONP Call</title>
    <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5.1.js" type="text/javascript"></script>
</head>
<body>
    <form id="form1" runat="server">
    <output id="result">
    </output>
    </form>
    <script type="text/javascript">
        $.getJSON('http://localhost:23330/SchoolDataService.svc/Courses?$format=json&$callback=?', 
        function (response) { 
            $.each(response.d, function (index, value) {
                var div = document.createElement('div');
                div.innerHTML = value.Title;
                $('#result').append(div);
            })
        });        
    </script>
</body>
</html>

Давайте рассмотрим код веб-формы: Сначала я использую Microsoft CDN, чтобы получить библиотеку jQuery. Затем я создал элемент вывода HTML5, чтобы добавить к нему вывод вызова. В основном скрипте я использую функцию jJuery getJSON, которая вызывает службу данных WCF. Обратите внимание, что для получения ответа JSON от службы данных WCF необходимо использовать параметр строки запроса $ format = json. После извлечения данных я выполняю итерацию и создаю элемент div для каждого полученного заголовка курса. Это делается в функции успеха, которую я связал при вызове функции getJSON. Вот результат выполнения кода:

enter image description here

Резюме

В этой статье я привел простой пример выполнения вызова JSONP в Службу данных WCF с использованием jQuery. Такое решение может помочь вам использовать службы данных WCF, которые существуют в других доменах со стороны клиента. В следующем посте я покажу тот же пример, используя новую datajs library

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...