将JSON发布到WCF REST端点 [英] POSTing JSON to WCF REST Endpoint

查看:86
本文介绍了将JSON发布到WCF REST端点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在为我的服务实现PUT,POST和DELETE.但是每次我尝试向服务器发送一些json时,都会收到错误无法创建抽象类".我通过通过DataContractJsonSerializer运行对象的实例,添加__type字段并将其包装在{"obj": mydata }中来生成请求数据.

I'm working on implementing PUT, POST, and DELETE for my service. But every time I try to send some json up to the server, get the error 'Cannot create an abstract class.' I generated my request data by running an instance of my object through a DataContractJsonSerializer, adding the __type field, and wrapping it in {"obj": mydata}.

我可以通过需要BaseObj的DataContractJsonSerializer来运行它,并且运行良好:

I can run this back through a DataContractJsonSerializer that expects a BaseObj and it works fine:

 {"__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}

我的服务合同以ServiceKnownType属性修饰,列表中包含RepositoryItemBaseObj.

My service contract is decorated with a ServiceKnownType attribute with the RepositoryItem and BaseObj included in the list.

我正在使用jquery进行发布

I'm POSTing using 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"
        });

我暴露了以下端点:

<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

以及以下对象(省略了IBaseObj,因为它可以由其实现者推断出来)

And the following objects (IBaseObj was omitted as it can be inferred by its 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

POST的提琴手输出:

Fiddler output from 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}}

您可以提供的任何帮助都会很棒.谢谢!

Any help you can provide would be great. Thanks!

推荐答案

大量信息,但始终很难远程调试,有几点提示:

Good volume of info, but always a difficult one to debug remotely, a couple of tips:

删除了提琴手技巧(据我所见,您正在使用它)

在您的ajax帖子中:

In your ajax post:

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

您应该使用 result.d 来获取消息内容.

You should be using result.d to get the message contents.

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

在调试消息中,insert_by字段为null,从片段中看,它似乎不可接受null(作为String?而不是String).

The insert_by field is null in the debug message, from the fragment it doesn't look like null is acceptable (as String? instead of as String).

这篇关于将JSON发布到WCF REST端点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆