【问题标题】:Passing a JSON object as a Dictionary(Of String, Object) to WCF Web Service将 JSON 对象作为 Dictionary(Of String, Object) 传递给 WCF Web 服务
【发布时间】:2011-09-08 19:00:28
【问题描述】:

我正在尝试使用 JSON 和 jQuery 设置由 JavaScript 使用的 WCF Web 服务。我注意到如果服务方法参数与 JSON 对象的命名结构匹配,您可以在没有 DataContract 的情况下发送 JSON:

<ServiceContract(Namespace:="http://foo.com/bar")>
<AspNetCompatibilityRequirements(RequirementsMode:=AspNetCompatibilityRequirementsMode.Allowed)>
Public Class WebServices

    <OperationContract()>
    Public Function Test(fullname As String)

        Return CustomFunctions.SerializeJSON(New With {
                                                .SSN = "999-99-9999",
                                                .Birthday = "9/22/1983"})
    End Function

End Class

...还有 JavaScript...

$.ajax({
    url: "webservices.svc/Test",
    data: JSON.stringify({
        "fullname" : "John Smith"
     }),
    type: "POST",
    processType: false,
    contentType: "application/json; charset=utf-8",
    dataType: "text",
    success: function (result)
    {
        console.log(result);
    },
    error: function (xhr)
    {
        console.log(xhr.responseText);
    }
});

这很好用,但如果我想向 Web 服务发送大量数据,就会出现问题。自然地,参数列表会变得非常长且丑陋。另一种方法是创建一个 DataContract。但是,我很可能会创建很多 Web 服务,并且我不想每次发送超过 5 个键值对的数据时都必须创建一个全新的 DataContract。

我希望有一种方法可以通过方法参数将传入的 JSON 对象作为 Dictionary(Of String, Object) 访问:

<OperationContract()>
Public Function Test(data As Dictionary(Of String, Object))
   Dim firstName As String = data("FirstName")
   Dim lastName as String = data("LastName")

   '...logic goes here...

   '....return JSON object

End Function

有人知道这是否可能吗?大多数人在这种情况下会做什么?我在 ASMX 中工作得很好,所以我知道这是可能的。

【问题讨论】:

    标签: vb.net wcf web-services json


    【解决方案1】:

    好的,我想我想出了如何做到这一点(对于那些感兴趣的人)。我需要绕过 DataContracts(没有什么反对 DataContracts,当唯一的客户端是我的 AJAX 代码时,它们只是一点点)。为此,我将 Web 服务方法更改为如下所示:

    <OperationContract()>
    <WebInvoke(Method:="POST", BodyStyle:=WebMessageBodyStyle.Bare, ResponseFormat:=WebMessageFormat.Json)>
    Public Function Test(request As Stream) As String
        Using reader As New StreamReader(request)
            Dim serializer As New JavaScriptSerializer()
            Dim data As Dictionary(Of String, Object) = serializer.Deserialize(Of Dictionary(Of String, Object))(reader.ReadToEnd())
    
            Dim firstName As String = data("FirstName")
            Dim lastName As String = data("LastName")
    
            Return serializer.Serialize(New With {.SSN = "999-99-9999",
                                                  .Birthday = "9/22/1983"})
        End Using
    End Function
    

    这会将请求作为原始流接收,并将反序列化留给我(我实际上更喜欢 - 魔法越少越好)。

    AJAX 没有太大变化,除了我需要删除 contentType(将其保留为默认值)并将响应的 dataType 更改为 json(当它是“文本”时,我需要将其反序列化两次)某种原因):

    $.ajax({
        url: "webservices.svc/Test",
        data: JSON.stringify({
            "FirstName": "John",
            "LastName": "Smith"
        }),
        type: "POST",
        dataType: "json",
        success: function (result)
        {
            var data = JSON.parse(result);
            console.log(data.SSN);
        },
        error: function (xhr)
        {
            console.log(xhr.responseText);
        }
    });
    

    我希望这可以帮助任何想要避免 DataContracts 的人。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-13
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2021-08-10
      • 2011-02-02
      • 2014-02-17
      相关资源
      最近更新 更多