WCF 无法获取 json

WCF Unable to get json

我在 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>
...

当我 POST 使用负载 http://localhost:64574/MyService.svc/notify 到我的服务时:

{ "Id":“123456789”, "Code":“1”, "ExId":“123456789”, "title" : "Title", "message" : "Sample Message" }

我收到以下错误。

The server encountered an error processing the request. The exception message is 'There was an error deserializing the object of type System.String. End element 'root' from namespace '' expected. Found element 'Id' from namespace ''.'. See server logs for more details. The exception stack trace is:

at System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator reader, Boolean verifyObjectName, DataContractResolver dataContractResolver) at System.Runtime.Serialization.Json.DataContractJsonSerializer.ReadObject(XmlDictionaryReader reader, Boolean verifyObjectName) at System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.ReadObject(Message message) at System.ServiceModel.Dispatcher.SingleBodyParameterDataContractMessageFormatter.ReadObject(Message message) at System.ServiceModel.Dispatcher.SingleBodyParameterMessageFormatter.DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.DemultiplexingDispatchMessageFormatter.DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.UriTemplateDispatchFormatter.DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.CompositeDispatchFormatter.DeserializeRequest(Message message, Object[] parameters) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc) at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)

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

您可以使用 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)

文档: