2010-01-14 24 views
11

Karmaşık bir nesneyi kabul eden bir İşlem Sözleşmem var ve jQuery aracılığıyla işlemi çağırıyorum. JQuery'yi kullanarak karmaşık bir nesne nesnesini nasıl geçiririm. Aşağıda operasyon imzadır:Karmaşık nesneleri bir WCF Rest Hizmeti'ne aktarma

public Resolution CreateNewResolution(Resolution NewResolution); 

Ben istemci üzerinde bir Çözünürlük nesnesindeki geçmesi gerekiyor, ama ben jQuery kullanarak böyle bir şey yapmak nasıl bilmiyorum. Herhangi bir yardım?

Ben GET onun kullanımı ile aynı fikirde değilim karşın

cevap

22

, bir başlangıç ​​için Denny's post Bkz teşekkürler ve karmaşık parametreleri için sorgu dizesi içinde JSON geçen. Bu gerçekten yanlış görünüyor.


Eğer data için kullanmak param senin Çözünürlük tipi ne varsa json temsilidir. Kullandığınız kod şöyle olabilir, JavaScript,

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

Sonra: Örneğin, sunucu tarafında böyle tanımlanır tipi ve operasyon varsayalım

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){ ... } 
}); 

Notlar:

  • Geçirilen JSON öğesindeki ilk nesne olmak için (r) değişkeninin adının en az WCF 4 olması gerekir. örneğin, başlangıçta değişkenin adını koymadan işe yaramadı.
  • JSON'daki karmaşık nesneleri iletmek için,
  • isteğinin türü (HTTP Yöntemi) olarak PUT veya POST kullanın, karmaşık nesneyi bir JSON dizesine dönüştürmeniz gerekir. a nice, tiny jquery plugin to do this var. Denny kendi uygulamasını sunar.
  • processData=true kullanırsam, hizmete gönderilen sonuç dizesinin JSO'da değil, querystring biçiminde olduğunu buldum. Karmaşık nesneleri geçmek için istediğim şey değil. Ben de onu yanlış olarak ayarladım. True kullanmak, WebGet yaptığınız daha basit JSON istekleri için iyi olurdu ve tüm paramlar sorgu dizesinde. dataFilter DateTime doğru seri kaldırma sağlar
  • msg param başarı geri arama geçirilen
  • geri json vardır.İşlemelerde.
  • isteğin URL Bu durumda
  • o .Svc etiketi saklanacak bir URL yeniden yazma kullanmak isteyebilirsiniz
  • , WCF hizmeti webHttp davranışını değil, enableWebScript kullanır. İkincisi, hizmeti çağırmak için dinamik olarak Javascript proxy'leri üretir, ancak soruyu sorduğunuz gibi, bunu istemezsiniz.

+1

Bunu PUT yerine PST göstermek için güncellemek ister misiniz? POST genel olarak çapraz site betiklerinden kaçınmanın en güvenli yolu olarak kabul edilir. – LamonteCristo

0

Kontrol dışarı Mike Flasko en session MIX11 de Sırasında WCF Veri Hizmetleri, JSONP ve jQuery

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

birleştiren ilgili Gil Fink blog, o bir JSONP farkında WCF Veri Hizmeti nasıl oluşturulacağını gösterdi MSDN kod galerisinde download için kullanılabilen bir JSONPSupportBehavior özniteliği ile (ve Microsoft.Data.Services.Extensions ad alanının bir parçası olması gerekiyordu). Bu gönderide, WCF Veri Hizmeti için bir JSONP etki alanı çağrısı yapmak için özniteliği ve jQuery'yi kullanan basit bir örnek göstereceğim.

İki farklı ASP.NET web uygulamaları oluşturarak başladı Ortamı

İlk ayarlama. İlk uygulama çağrı sayfasını ve ikincisi WCF Veri Hizmetini içerir. Ardından, ikinci web uygulamasında bir Varlık Çerçevesi modeli ve bu modelden WCF Veri Hizmeti oluşturdum. Daha önce verdiğim link ürününde bulunan JSONPSupportBehavior.cs sınıfını da ekledim. Sınıf, WCF IDispatchMessageInspector arabirimini uygulayan JSONPSupportBehavior uygulamasının uygulanmasını içerir. Ayrıca kodumda kullandığım JSONPSupportBehaviorAttribute içerir. Kod basittir ve benzer: Ben JSONP çağrı örnek yapacak bir web formu oluşturduk ikinci bir web uygulamasında JSONP Çağrısı

yapma

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

. İşte çağrı yapan kod şudur: jQuery kütüphanesini almak üzere Microsoft CDN kullanmak İlk başta :

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

web formu kodu keşfetmek sağlar. Ardından, aramanın çıktısını eklemek için bir HTML5 çıktı öğesi oluşturdum. Ana komutta, jQuery’nin WCF Veri Hizmetini çağıran getJSON işlevini kullanıyorum. WCF Veri Hizmetinden bir JSON yanıtı alabilmek için $ format = json sorgu dizesi parametresini kullanmanız gerektiğini unutmayın. Verileri aldıktan sonra, yinelenen her bir ders başlığı için bir div öğesi oluşturuyorum. Bu getJSON işlev çağrısında kablolu hale getirdiğim başarı işlevinde yapılır.

enter image description here

Özeti

posta ben jQuery kullanarak bir WCF Veri Hizmetleri bir JSONP arama yapmak basit bir örnek verilir: Burada kod çalıştıran çıkışıdır. Bu tür bir çözüm, müşteri alanınızdan diğer etki alanlarında bulunan WCF Veri Hizmetlerini kullanmanıza yardımcı olabilir. Bir takip mesajında ​​aynı örneği yeni datajs kütüphanesini kullanarak göstereceğim

İlgili konular