2010-12-09 20 views
2

Je travaille sur l'implémentation de PUT, POST et DELETE pour mon service. Mais chaque fois que j'essaie d'envoyer un fichier json au serveur, je reçois l'erreur 'Impossible de créer une classe abstraite'. J'ai généré mes données de requête en exécutant une instance de mon objet via un DataContractJsonSerializer, en ajoutant le champ __type et en l'enveloppant dans {"obj": mydata}.POSTing JSON à WCF REST Endpoint

Je peux exécuter ce à travers un DataContractJsonSerializer qui attend un BaseObj et il fonctionne très bien:

{"__type":"RepositoryItem:http:\/\/objects\/","Insert_date":null,"Modified_date":null,"insert_by":null,"last_modify_user_id":null,"modified_by":null, "external_id":"1234","internal_id":54322,"school_id":45,"type_name":0, "vendor_id":57} 

Mon contrat de service est décoré avec un attribut ServiceKnownType avec le RepositoryItem et BaseObj inclus dans la liste.

Je POSTer en utilisant jquery

 $.ajax({ 
      type: "POST", 
      url: "http://localhost/slnSDK/service.svc/create/repositoryitem.json?t=" + token, 
      data: data, 
      success: function(result) { 
       $("#input").html(result); 
      }, 
      error: function(xhr, result, err) { 
       $("#htmloutput").html(xhr.responseText); 
      }, 
      dataType: "json", 
      contentType: "application/json" 
     }); 

J'ai le point final suivant exposé:

<OperationContract(Action:=Api2Information.Namespace & "createJson")> _ 
<WebInvoke(Method:="POST", _ 
      BodyStyle:=WebMessageBodyStyle.Bare, _ 
      RequestFormat:=WebMessageFormat.Json, _ 
      responseFormat:=WebMessageFormat.Json, _ 
      UriTemplate:="/create/{objType}.json?t={token}")> _ 
Function createJson(ByVal objType As String, ByVal obj As BaseObj, ByVal token As String) As Integer 

Et les objets suivants (IBaseObj a été omis car il peut être déduit par son implementor)

<DataContract(Namespace:="http://objects/")> _ 
Public Class RepositoryItem : Inherits BaseObj 

    ' members backing properties have been omitted. 

    Public Sub New() 
    ... 

    <DataMember()> _ 
    Public Property type_name() As eType 
    ... 

    ' Override this to expose it as a property on the WebAPI 
    <DataMember()> _ 
    Public Overrides Property internal_id() As Integer? 
    ... 

    <DataMember()> _ 
    Public Property external_id() As String 
    ... 

    <DataMember()> _ 
    Public Property vendor_id() As Integer 
    ... 

End Class 

<DataContract(Namespace:="http://objects/")> _ 
<Serializable()> _ 
Public MustInherit Class BaseObj : Implements IBaseObj 

    ' members backing properties have been omitted. 

    <DataMember()> _ 
    Public Overridable Property insert_by() As String Implements IBaseObj.Insert_by 
    ... 

    <DataMember()> _ 
    Public Overridable Property Insert_date() As Nullable(Of Date) Implements IBaseObj.Insert_date 
    ... 

    <DataMember()> _ 
    Public Overridable Property modified_by() As String Implements IBaseObj.Modified_by 
    ... 

    <DataMember()> _ 
    Public Overridable Property Modified_date() As Nullable(Of Date) Implements IBaseObj.Modified_date 
    ... 

    <DataMember()> _ 
    Public Overridable Property last_modify_user_id() As Nullable(Of Integer) Implements IBaseObj.Last_modify_user_id 
    ... 

End Class 

Sortie Fiddler de POST:

POST http://localhost/slnSDK/service.svc/create/repositoryitem.json?t= HTTP/1.1 
Host: localhost 
Connection: keep-alive 
Referer: http://localhost/apitest.html 
Content-Length: 265 
Origin: http://localhost 
X-Requested-With: XMLHttpRequest 
Content-Type: application/json 
Accept: application/json, text/javascript, */*; q=0.01 
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.7 (KHTML, like Gecko) RockMelt/0.8.36.79 Chrome/7.0.517.44 Safari/534.7 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3 
Cookie: ASP.NET_SessionId=ywyooz45mi3c4d55h4ld4bec; x=lHOtsYBHvS/fKE7JQWzFTw==; y=XhfNVfYYQynJrIZ/odWFOg== 

{"obj":{"__type":"RepositoryItem:http:\/\/objects\/","Insert_date":null,"Modified_date":null,"insert_by":null,"last_modify_user_id":null,"modified_by":null, "external_id":"1234","internal_id":54322,"school_id":45,"type_name":0, "vendor_id":57}} 

Toute aide que vous pouvez fournir serait géniale. Merci!

Répondre

1

Bon volume d'informations, mais toujours difficile à déboguer à distance, quelques conseils:

enlevé pointe Fiddler (comme je vous vois utiliseriez)

Dans votre message ajax :

success: function(result) { 
     $("#input").html(result); 
    }, 

Vous devez utiliser result.d pour obtenir le contenu du message.

success: function(result) { 
     $("#input").html(result.d); 
    }, 

Le champ insert_by est nul dans le message de débogage, du fragment, il ne ressemble pas à null est acceptable (comme chaîne? Au lieu comme String).

+0

J'ai mis à jour mon message pour refléter cela, mais cette requête HTTP a été capturée en utilisant Fiddler. En outre, merci pour les têtes sur les données de retour. –

+0

Réponse mise à jour, les champs nuls sont-ils un problème? – amelvin

+0

hm. Je l'ai essayé à nouveau avec des valeurs dans mes champs de chaînes nulles, pas de dés. –