【问题标题】:WCF Unable to get jsonWCF 无法获取 json
【发布时间】:2015-04-03 03:29:46
【问题描述】:

我在将 json 导入我的 WCF REST 服务时遇到问题。

<ServiceContract()>
Public Interface IMyService

    <OperationContract()>
    <WebInvoke(Method:="POST",
    RequestFormat:=WebMessageFormat.Json,
    ResponseFormat:=WebMessageFormat.Json,
    UriTemplate:="notify",
    BodyStyle:=WebMessageBodyStyle.Bare)>
    Sub Notify(message As String)

End Interface

...
      <service name="MyService" behaviorConfiguration="ServiceBehavior">
        <endpoint binding="webHttpBinding" behaviorConfiguration="webHttp" bindingConfiguration="webBinding" contract="IMyService" />
      </service>
      ...
      <endpointBehaviors>
        <behavior name="webHttp">
          <webHttp  />
        </behavior>
      </endpointBehaviors>
...

当我在http://localhost:64574/MyService.svc/notify 使用有效负载发布到我的服务时:

{ “身份证”:“123456789”, “代码”:“1”, “ExId”:“123456789”, “标题”:“标题”, “消息”:“示例消息” }

我收到以下错误。

服务器在处理请求时遇到错误。例外 消息是'反序列化类型对象时出错 系统字符串。应来自命名空间“”的结束元素“根”。成立 命名空间 ''.' 中的元素 'Id'。有关更多详细信息,请参阅服务器日志。 异常堆栈跟踪是:

在 System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator 阅读器,布尔验证对象名称,DataContractResolver dataContractResolver) 在 System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject(XmlDictionaryReader 阅读器,布尔验证对象名称)在 System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.ReadObject(消息 消息)在 System.ServiceModel.Dispatcher.SingleBodyParameterDataContractMessageFormatter.ReadObject(消息 消息)在 System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.DeserializeRequest(消息 消息,对象 [] 参数)在 System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(消息 消息,对象 [] 参数)在 System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(消息 消息,对象 [] 参数)在 System.ServiceModel.Dispatcher.CompositeDispatchFormatter.DeserializeRequest(消息 消息,对象 [] 参数)在 System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& RPC)在 System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) 在 System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

编辑: 理想情况下,我想使用 OperationContext.Current.RequestContext.RequestMessage 从请求正文中获取原始 json,但似乎我只能获取 xml。当我使用 JsonConvert.SerializeXmlNode(doc) 我得到 json 但不是我期望的原始 json。

【问题讨论】:

  • 你试过 BodyStyle WebMessageBodyStyle.Wrapped 吗?
  • 对不起,我的意思是 WebMessageBodyStyle.WrappedRequest
  • 是的,我试过了。 WebMessageBodyStyle.WrappedRequest 或 WebMessageBodyStyle.Wrapped 返回“示例消息”。我需要整个 json 对象。

标签: .net wcf rest


【解决方案1】:

您可以使用System.IO.Stream 作为参数。

示例:

WCF 服务接口:

<ServiceContract()>
Public Interface IService1
  <OperationContract()>
  Sub NotifyStream(jsonStream As Stream)
End Interface

WCF 服务实现:

Public Class Service1 Implements IService1
  Public Sub NotifyStream(jsonStream As Stream) Implements IService1.NotifyStream
        Dim jsonString = ""
        Using reader As New StreamReader(jsonStream, Encoding.UTF8)
            jsonString = reader.ReadToEnd
        End Using
        'Do something with jsonString'
  End Sub
End Class

WCF 客户端:

Dim client = New Service1Client
Dim jsonString = "{ 'Id' : '123456789', 'Code' : '1', 'ExId' : '123456789', 'title' : 'Title', 'message' : 'Sample Message' }"
Dim stream = New MemoryStream(Encoding.UTF8.GetBytes(jsonString))
client.NotifyStream(stream)

文档:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 2019-10-07
    • 2012-02-18
    • 2012-04-28
    相关资源
    最近更新 更多